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

时间:2012-10-01 18:44:59

标签: linux replace sed find

我想替换例如文件夹中所有.txt文件中包含的“123”和“321”的所有实例(递归)。 我想过这样做

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

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

1 个答案:

答案 0 :(得分:6)

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

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

find查找扩展名为.txt的文件,并对其中的组运行sed -i命令(最后是+;它是POSIX 2008中的标准,但是并非find的所有版本都必须支持它。在这个示例替换中,没有错误解释s/123/321/g命令的危险,所以我没有将它括在引号中。但是,为了简单和一般安全,最好尽可能将sed脚本用单引号括起来。

您还可以使用xargs(并再次使用GNU扩展-print0find-0以及-rxargs):< / p>

find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'

-r表示“如果没有参数则不运行”(因此find找不到任何内容)。 -print0-0协同工作,生成以C空字节'\0'而不是换行符结尾的文件名,并避免误解包含换行符,空格等的文件名。< / p>

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