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
在这里可以找到更多示例。