私は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[}
。