スクリプトでは、awk
フィールド区切り文字として「(」を使用しようとしています。ただし、次のように二重のバックスラッシュで括弧をエスケープしないと、
BEGIN {FS=" \\("}
それは動作しません。
使うFS=" \("
と
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
出力で括弧を全くエスケープしない場合は、
awk: prog:2: fatal: :, [., or [=: / (/
メッセージ。
この動作について説明していただけますか?
答え1
␣(
でフィールド区切り文字として (スペース + 括弧)を使用するにはawk
、次のようにします"␣\\\("
。
$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
あるいは、一重引用符と 2 つのバックスラッシュを使用します。
$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
その理由は␣(
(括弧が1つだけと先頭にスペースがある文字列は不正な正規表現です。左括弧は閉じられないグループ化を開始します。このため、エスケープする必要があります。
(
(括弧が1つだけそれなしFS
が 1 文字の場合、正規表現として扱われないという点が異なります (先頭のスペースが 1 つだけの場合) 。
答え2
同様の問題 ( awk のフィールド区切りとして␣
ORを使用する) の解決策を探しているときに、このスレッドを見つけました(
。これでは完全には解決しませんでしたが、私の解決策を紹介します。
awk でファイルを分離するために組み合わせを␣(
単一の単位として扱いたい場合は、次のようにしますawk -F '( \\()' ...
。
$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()
Number of Fields: 2
私と同様の問題の解決策を探している場合は、または␣
、(
次の操作を実行してくださいawk -F '( |\\()' ...
。
$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe)
is
a
test
)
Number of Fields: 7