Linux:如何在单个类型的所有文件中将字符串的所有实例替换为另一个实例

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)

但在可能搞砸我的所有文件之前,我想问一下它是否有用.

Jon*_*ler 6

你有sedfind后面的前面.使用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扩展-print0find-0-rxargs):

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绝不会让您感到痛苦.