Jea*_*lho 2 linux replace sed find
我想替换例如文件夹中所有.txt文件中包含的"123"和"321"的所有实例(递归).我想过这样做
sed -i 's/123/321/g' | find . -name \*.txt
Run Code Online (Sandbox Code Playgroud)
但在可能搞砸我的所有文件之前,我想问一下它是否有用.
你有sed和find后面的前面.使用GNU sed和-i选项,您可以使用:
find . -name '*.txt' -type f -exec sed -i s/123/321/g {} +
Run Code Online (Sandbox Code Playgroud)
该find认定文件与扩展.txt和运行sed -i它们的组命令(这是+在年底,它在2008年的POSIX标准,但并非所有的版本find一定支持它).在这个示例替换中,没有错误解释s/123/321/g命令的危险,所以我没有将它括在引号中.但是,为了简单和一般安全,最好尽可能将sed脚本用单引号括起来.
您也可以使用xargs(并再次使用GNU扩展-print0到find和-0并-r到xargs):
find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'
Run Code Online (Sandbox Code Playgroud)
该-r方法(因此"如果没有参数不跑" find没有找到任何东西).在-print0和-0协同工作,生成与C空字节结尾的文件名'\0',而不是换行,并避免含有换行符,空格等文件名的错误解释.
请注意,在对真实数据运行脚本之前,您可以并且应该对其进行测试.创建一个虚拟目录(我通常称之为junk),将一些示例文件复制到垃圾目录中,将目录更改为垃圾目录,然后在这些文件上测试脚本.因为它们是复制品,所以如果出现问题就没有坏处.然后您可以简单地删除目录中的所有内容:rm -fr junk绝不会让您感到痛苦.
| 归档时间: |
|
| 查看次数: |
12153 次 |
| 最近记录: |