我想替换例如文件夹中所有.txt文件中包含的“123”和“321”的所有实例(递归)。 我想过这样做
sed -i 's/123/321/g' | find . -name \*.txt
但在可能搞砸我的所有文件之前,我想问一下它是否有用。
答案 0 :(得分:6)
您有sed
和find
回到最前面。使用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扩展-print0
到find
和-0
以及-r
到xargs
):< / 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
永远不会让您感到痛苦。