例如,我想用文件夹中所有 .txt 文件中包含的“321”替换所有“123”实例(递归)。我想过这样做
sed -i 's/123/321/g' | find . -name \*.txt
但在可能搞砸我所有的文件之前,我想问一下它是否可以工作。
你有sed
和从find
后到前。使用 GNUsed
和-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
to find
and-0
和-r
to xargs
):
find . -name '*.txt' -type f -print0 | xargs -0 -r sed -i 's/123/321/g'
意思是“-r
如果没有参数就不要运行”(所以find
找不到任何东西)。-print0
and协同工作,-0
生成以 C 空字节'\0'
而不是换行符结尾的文件名,并避免对包含换行符、空格等的文件名的误解。
请注意,在对真实数据运行脚本之前,您可以并且应该对其进行测试。创建一个虚拟目录(我通常称之为junk
),将一些示例文件复制到垃圾目录中,将目录更改为垃圾目录,然后在这些文件上测试您的脚本。由于它们是副本,因此如果出现问题,也不会造成任何伤害。之后您可以简单地删除目录中的所有内容:rm -fr junk
永远不会让您感到痛苦。