2

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

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

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

4

1 回答 1

6

你有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 扩展-print0to findand-0-rto xargs):

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

意思是“-r如果没有参数就不要运行”(所以find找不到任何东西)。-print0and协同工作,-0生成以 C 空字节'\0'而不是换行符结尾的文件名,并避免对包含换行符、空格等的文件名的误解。

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

于 2012-10-01T18:52:54.477 回答