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[}

答え2

次のビルドを試すことができます。

awk -v FS='\\[\}'  ' {printf}' input_file

ただ「二重」エスケープが必要です。[

記録には、次の構造バリアントを使用できます。

 awk 'BEGIN{ FS="\\[\}"}  ' {printf}' input_file

または

awk   ' {printf}' FS='\\[\}' input_file

このような構成もタスクを実行します。

awk -F '[[]}' '{printf}' input_file

オプションの区切り文字の「リスト」[には、のみを含める必要があります。}

PS Singleprintfawk。印刷する書式文字列や変数など、いくつかのパラメータを追加する必要があります。他の回答で述べたように、行全体を印刷するには'1'代わりに使用してください。'{printf}'

答え3

私は角括弧式がこれらのawk(!)区切り文字の問題に対する最も簡単な解決策を提供することが多いことがわかりました。 @casのコメントによると:

$ echo 'one[}two' | awk -F '[[]}' '{print $2}'
two

角かっこ式の構文に慣れるのは確かに価値があります。慣れていないと一見するとそう見えないかもしれませんが、二重エスケープ(!)よりもシンプルさと実用性が使いやすく読みやすい場合が多いです。もちろん、grepなどの他のユーティリティでも使用できます。

関連情報