Linux:如何将一个string的所有实例replace为一个types的所有文件中的另一个实例

我想用文件夹中的所有.txt文件(recursion地)包含“321”来代替所有“123”的实例。 我想过这样做

sed -i 's/123/321/g' | find . -name \*.txt 

但在可能搞砸我所有的文件之前,我想问问它是否会工作。

你有sedfind回到前面。 使用GNU sed-i选项,您可以使用:

 find . -name '*.txt' -type f -exec sed -is/123/321/g {} + 

find找到扩展名为.txt文件,并在它们的组上运行sed -i命令(这是最后的+ ;它在POSIX 2008中是标准的,但不是所有版本的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' 

-r表示'不运行,如果没有参数'(所以找不到任何东西)。 -print0-0工作,生成以C空字节'\0'结尾而不是换行符结尾的文件名,避免误解包含换行符,空格等的文件名。

请注意,在真实数据上运行脚本之前,您可以并且应该对其进行测试。 制作一个虚拟目录(我通常称之为junk ),将一些示例文件复制到垃圾目录中,将目录更改为垃圾目录,然后在这些文件上测试脚本。 既然他们是副本,如果出了什么问题就没有什么坏处。 然后你可以简单地删除目录中的所有内容: rm -fr junk不应该让你痛苦。