gawk
の-i inplace
オプションを使用して印刷することは可能stdout
ですか?
たとえば、ファイルを更新したい場合で、変更がある場合は、ファイルの名前と変更された行を出力stderr
して、次のようにします。
find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
しかしstdout
、代わりに使用する方法、またはそのブロックを代替ストリームに出力するよりクリーンな方法はありますか?
grep
ことができるかを忘れます。私の最初の本能は、ファイルを2回「処理」する必要がないようにすることですが、それでも実際に高速であるとしても、まったく驚かないでしょう。それは私がプロファイリングタスクに私の根性を信頼できる理由を示すために行きます
-print -exec gawk
はもう実行されません)。2)最初の一致で停止するため、最初の一致が最後の行では、ファイル全体を2回処理していません(1.X回に近い)。また、このgawk -i inplace
ようsed -i
に機能する場合は、とにかくファイルをインプレース編集します。つまり、編集するものが何もない場合でも、タイムスタンプ、inodeなどを更新します...
find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;
では、そのパターンに一致する行を実際に含むファイルを編集するためにawkのみを使用するような方法で実行したい場合があります。