sed
在实际运行之前,有什么方法可以运行试用递归搜索并替换 using吗?我只想在实际进行搜索和替换之前打印出结果。类似于呼应的结果,
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
Run Code Online (Sandbox Code Playgroud)
gre*_*eke 11
您可以在sed
没有的情况下运行-i
并逐步执行输出less
grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less
Run Code Online (Sandbox Code Playgroud)
然后运行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
Run Code Online (Sandbox Code Playgroud)
编辑:如评论中所建议,使用grep --null | xargs -0
. 这会导致文件名以空字节结尾,这使得带有不寻常字符(如换行符)的文件名安全。是的,\n
是 unix 文件名中的有效字符。唯一禁止的字符是斜杠/
和空字符\0
Ser*_*ndt 10
sed
与find
替代grep
首先,我会使用find
而不是grep
,这是出于三个很好的原因:
find
允许更精确的文件选择。例如,grep -r string *.txt
将只在当前目录中生成文件;不是子目录中的那些。find
带有强大的-exec
选项,消除了对整个--null … |xargs 0
构造的需要。-readable
和-writable
选项find
将防止在无法访问的文件上浪费时间。也就是说,grep
确实适合进行第一次测试以查看将捕获的内容:
$ find . -exec grep term1 {} \;
Run Code Online (Sandbox Code Playgroud)
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;
Run Code Online (Sandbox Code Playgroud)
现在,继续进行sed
试运行。该sed
选项-n
是 for 的同义词,--quiet
并且p
在sed
表达式的最后将打印当前模式空间。
$ find . -exec sed -n 's/term1/term2/gp' {} \;
Run Code Online (Sandbox Code Playgroud)
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;
Run Code Online (Sandbox Code Playgroud)
如果一切正常,请通过将sed
选项替换为“就地”并删除末尾的选项-n
来发出最终命令。-i
p
$ find . -exec sed -i 's/term1/term2/g' {} \;
Run Code Online (Sandbox Code Playgroud)
或更具体地说:
$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;
Run Code Online (Sandbox Code Playgroud)
find
例子find
可以在此处找到更多示例。
归档时间: |
|
查看次数: |
9607 次 |
最近记录: |