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のみを使用するような方法で実行したい場合があります。