スペースで区切るが、バックスラッシュスペースは無視する


8
5678 []
testing,\ group []
[testing []
ip\ 5.6.7.8 []
launch-wizard-1 0.0.0.0/0
456dlkjfa []
1.2.3.4 []
test 1.2.3.4/32 4.3.2.0/23 4.3.2.0/23
default 4.3.2.0/23 4.3.2.0/23
launch-wizard-2 0.0.0.0/0
launch-wizard-3 0.0.0.0/0
2.3.4.5/32 []

上記の最初の列を取得したいのですが、問題は、\ (バックスラッシュスペース)を列の一部として扱う必要があるためawk '{print $1}'です。

5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32

\は常にエスケープ文字として扱われ\ ますか、それとも特別なものですか?たとえば、 a\\ b1つまたは2つのフィールドですか?
グレゴリーニスベット

私が\に入れた@GregoryNisbetは、実際のデータではなく、エスケープ文字用です
GypsyCosmonaut '26

1
データに実際のバックスラッシュが含まれている場合、どのように表されますか?
Gregory Nisbet

@GregoryNisbetいい質問ですね。で置き換えただけなので、元のデータはそのまま\そのまま残っ[[:space:]]てい\[[:space:]]ます。唯一のスペースで区切られた最初の列に元のデータを取得していないの後\[[:space:]]、私は交換することだろう\[[:space:]][[:space:]]、私は再び\有している元のデータが残っているはずです。
GypsyCosmonaut

回答:


9

gnu awk(gawk)を使用すると、\<orのような長さゼロのアサーションを使用できます\>

$ echo 'a\ b c' | gawk 'BEGIN{FS="\\> +"} {print $1}'
a\ b

残念ながらない、本格的なものから、perlまたはpcre(例えば(?<!\\)(?<=\w)など):

$ echo 'a\ b, c' | perl -nle '@a=split /(?<!\\)\s+/, $_; print $a[0]'
a\ b,

5

\ spaceを別のものに置き換えて、後で再び戻すことができます。

sed 's/\\ /\\x20/g' data_file | awk '{ print $1; }' | sed 's/\\x20/\\ /g'

sedのみ:sed 's / \\ / \\ x20 / g; s /。* //; s / \\ x20 / \\ / g' data_file
ctac_

または、AWK、デフォルトのSUBSEPの変数値を使用して\034awk '{gsub(/\\ /,SUBSEP,$0); val=$1; gsub(SUBSEP,"\\ ",val); print val}' file
グレン・ジャックマン

5

GNU grepまたは互換性あり:

grep -Po '^(\\.|\S)*'

またはEREを使用:

grep -Eo '^(\\.|[^\[:space:]])*'

これは\、空白文字を区切り文字として使用するだけでなく、それ自体も引用演算子として扱います。つまり、foo\\ bar入力時にを返しますfoo\\


4

だけでsed

sed -r 's/^((([^\]*\\ ){1,})?[^ ]*).*/\1/' infile

またはより短い:

sed -r 's/^(([^\]*\\ )*[^ ]*).*/\1/' infile

これは(([^\]*\\ ){1,})?[^ ]*一致します:

  • [^\]*\\:バックスラッシュの後にスペースが続くバックスラッシュで\はないもの(文字クラスの内側はエスケープする必要がないが、外側はエスケープする必要があることに注意してください)。
  • ([^\]*\\ ){1,}:上記と1回以上の出現回数で一致します。
  • (([^\]*\\ ){1,})?:を使用する場合、これはオプションです(...)?([^\]*\\ ){0,}または代わりに使用することもできます([^\]*\\ )*
  • ((([^\]*\\ ){1,})?[^ ]*):オプションである上記と一致し、その後にスペース以外の任意のものが続き、グループ一致として保持\1し、後方参照として保持します。
  • ((([^\]*\\ ){1,})?[^ ]*).*:上記(...)およびその他すべてに一致します.*

次に、交換部品\1である出力を出力します。

5678
testing,\ group
[testing
ip\ 5.6.7.8
launch-wizard-1
456dlkjfa
1.2.3.4
test
default
launch-wizard-2
launch-wizard-3
2.3.4.5/32
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.