Shell 对目录中的所有文件进行文本替换

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

Shell对目录中的所有文件进行文本替换

实战演练

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

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

工作原理

我们使用find命令在当前目录(.)下查找所有的.cpp文件。它使用-print0打印出以\0作为分隔符的文件列表(这可以避免文件名中的空格所带来的麻烦)。然后使用管道将文件列表传递给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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Shell 实例