在运行之前测试递归 sed 搜索和替换

use*_*482 16 sed

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

使用sedfind替代grep

首先,我会使用find而不是grep,这是出于三个很好的原因:

  1. find允许更精确的文件选择。例如,grep -r string *.txt将只在当前目录中生成文件;不是子目录中的那些。
  2. find带有强大的-exec选项,消除了对整个--null … |xargs 0构造的需要。
  3. -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并且psed表达式的最后将打印当前模式空间。

$ 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来发出最终命令。-ip

$ 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可以在此处找到更多示例。