Answers:
您可以sed不运行而-i使用less
grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less
然后运行sed与-i.bak创建备份,你可以事后diff的
grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct
编辑:如注释中所建议,使用grep --null | xargs -0。这将导致文件名以空字节终止,这使得使用诸如换行符之类的不寻常字符的文件名安全。是的,\n是Unix文件名中的有效字符。唯一禁止使用的字符是斜杠/和nul字符\0
grep -rl --null因为OP没有指定OS,这-Z意味着在BSD / OSX上有所不同(解压缩)。--null在GNU和BSD上都相同
grep是FreeBSD和NetBSD上的GNU grep(的一个分支)。在NetBSD上,-Z仍然意味着--null(根据手册页),但是我同意--null更可移植。还要注意的是,无论--null也不在OpenBSD -Z工作
sed -i '' -e s/.../在BSD sed(没有可选选项有)
sed与find替代grep首先,我将雇用find而不是grep,这是出于三个充分的理由:
find允许更精确的文件选择。例如,grep -r string *.txt仅在当前目录中产生文件;而不是子目录中的那些。find带有功能强大的-exec选项,从而消除了对整个--null … |xargs 0结构的需求。-readable和-writable选项find将防止浪费时间在无法访问的文件上。就是说,grep确实适合进行第一个测试以查看将捕获的内容:
$ find . -exec grep term1 {} \;
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;
现在,进行sed空转。该sed选项-n为同义词--quiet和p在的最后sed表达将打印当前模式空间。
$ find . -exec sed -n 's/term1/term2/gp' {} \;
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;
如果一切正常,通过更换发出明确的命令sed选项,-n通过-i对“到位”,并通过去除p底。
$ find . -exec sed -i 's/term1/term2/g' {} \;
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;
find例子find在这里可以找到更多示例。