リコール:最も一般的なパターンはラインに対して正規表現またはテストです
awk 'pattern { action }'
カウント:
awk '/FOO/ { do_something_with_a_line_with_FOO_in_it }'
awk 'FNR==10'
デフォルトがあるので、最後のものが何もアクションを持っていません行を印刷します。
しかし、値を返す関数もパターンとして使用できます。 gsub
は関数であり、置換の数を返します。
だから、与えられた:
$ echo "$txt"
abc./.def line 1
ghk/lmn won't get printed
abc./.def abc./.def printed
あなたが行うことができます成功した置換を有する線のみ印刷するには:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U")'
abcUdef line 1
abcUdef abcUdef printed
を実行したいので、あなたはアクションブロックにgsub
を配置する必要はありませんそれはすべての行にあり、何が起こったかについての返品があなたに何かを伝えます。 gsub
は置換の数を返すので、正常にマッチした行が出力されます。
が一致している場合、あなたは関係なく、印刷されたすべての行をしたい場合:
$ echo "$txt" | awk 'gsub(/\.\/\./,"U") || 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
それとも、あなたはその後、空のパターンとアクションと空のアクションと1
としての機能を使用することができます。
$ echo "$txt" | awk '{gsub(/\.\/\./,"U")} 1'
abcUdef line 1
ghk/lmn won't get printed
abcUdef abcUdef printed
いずれの場合も、アクションのないパターンとして1
が一致するかどうかにかかわらず行を印刷し、一致する場合にはgsub
があれば置換します。
第2のawk
はあなたのものです。なぜあなたの入力データに作用していないのかは、おそらく入力データに関係しています。
awkは、このような操作に最適なツールではありません。あなたが自分の選択をすることが許されているなら、代わりに 'sed'を使うことを提案します。 – DyZ
もし 'echo" abc./.def "| awk 'gsub(/\.\/\./、 "U")' '期待通りに動作します。 – dawg
http://stackoverflow.com/help/mcve – melpomene