gawkのFSに「[}」または「[)」を設定するには?

gawkのFSに「[}」または「[)」を設定するには?

私はGNU Awk 5.0.1を使用しており、[}or[)FS。私はそれを動作させることはできません。私が試したことは次のとおりです。

root@u2004:~# echo test | awk -F '[}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\}' '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F '[\\}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[\}/
root@u2004:~# echo test | awk -F '[}}' '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~# echo test | awk -F "[}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[\\}" '{printf}'
awk: warning: escape sequence `\}' treated as plain `}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}/
root@u2004:~# echo test | awk -F "[}}" '{printf}'
awk: fatal: invalid regexp: Unmatched [, [^, [:, [., or [=: /[}}/
root@u2004:~#

どうすればいいですか?

ベストアンサー1

入力フィールド区切り文字()として使用される複数文字の文字列は正規表現として解釈されるFSため、その文字列は有効な正規表現でなければなりません。

awk -F '\\[}' '{ print }'

特別な操作は必要ありませんが、リテラルを開く角かっこに一致するように}最初の文字をエスケープする必要があります。[のように単一のバックスラッシュを使用すると、角かっこが\[}エスケープされ、区切り文字式が[}無効な正規表現であるように設定されるため、2つのバックスラッシュが必要です。リテラルと一致させるために角かっこ式を使用する[[]inを代わりに使用することもできますが、入力時間を節約できず、読みにくい場合があります。\\[[

私もコードを自由に修正しました。このprintf文は型文字列を引数として使用し、1つ以上の式を出力します。フォーマット文字列を指定しなかったため、エラーが発生します。

より短いバリアントは1(または空ではなくゼロ以外の文字列)を使用することです。これは次の役割を果たします。テストこれは常に本当です。実際のテストでは、現在のレコード(行)を印刷する基本ジョブが実行されます。

awk -F '\\[}' '1'

...各入力行を出力する以外は興味深いことはありません。区切り値のより有用なテストは次のとおりです。

awk -F '\\[}' '{ print $1 }'

...各入力レコードの最初のフィールドを印刷します。{]ABCたとえば、入力が{]ABC[}{]123[}

おすすめ記事