是否可以使用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
替代方法吗?还是有一种更清洁的方法来将该块打印到备用流?
@don_crissti我经常忘记快得多
—
Eric Renouf
grep
。我的第一个直觉是避免不得不对文件进行两次“处理”,但是即使它确实更快,我也不会感到惊讶。它只是说明了为什么我可以相信我对分析工作的直觉
是的,它非常快,请记住:1)如果没有匹配项,则只处理一次文件(
—
don_crissti
-print -exec gawk
不再执行的部分)和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编辑实际上包含与该模式匹配的行的文件。