Shell 对目录中的所有文件进行文本替换,我们经常需要将目录下所有文件中的特定文本替换成其他内容。例如在网站的源文件目录中替换一个URI。

实战演练

我们可以首先使用find找到需要进行文本替换的文件,然后由sed负责完成实际的替换操作。假设我们希望将所有.cpp文件中的Copyright替换成Copyleft

find . -name *.cpp -print0 |  
    xargs -I{} -0 sed -i 's/Copyright/Copyleft/g' {}

工作原理

我们使用find命令在当前目录(.)下查找所有的.cpp文件。它使用-print0打印出以作为分隔符的文件列表(这可以避免文件名中的空格所带来的麻烦)。然后使用管道将文件列表传递给xargs,后者将文件名作为sed的参数,通过sed修改文件内容。

补充内容

回忆一下,find有一个选项-exec,它可以对查找到的每个文件执行命令。我们可以使用该选项实现同样的效果或是改用下列命令:

$ find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' {} ;

或者

$ find . -name *.cpp -exec sed -i 's/Copyright/Copyleft/g' {} +

尽管这两个命令效果相同,但第一个命令会为查找到的每个文件调用一次sed,而在第二个命令中,find会将多个文件名一并传递给sed

最后修改:2024 年 05 月 20 日
如果觉得我的文章对你有用,请随意赞赏