linux如何在多个文件中替换某个字符串

来源:互联网 发布:centos squid 编辑:程序博客网 时间:2024/05/16 19:39

1 vim


假定你有个变量名为 "x_cnt" 而你要把他改为 "x_counter"。
这个变量在多个 C 文件都被用到了。你需要在所有文件中作此改动。你得这么做。
把所有相关文件放进参数列表:
:args *.c
这个命令会找到所有的 C 文件并编辑其中的第一个。
现在你可以对所有这些文件执行置换命令:
:argdo %s/\<x_cnt\>/x_counter/ge | update
命令 ":argdo" 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。
作为参数的替换命令 "%s" 作用于所有文本行。它用 "\<x_cnt\>" 来查找"x_cnt"。
"\<" 和 "\>" 用来指定仅匹配那些完整的词,而不是 "px_cnt" 或"x_cnt2"。
替换命令的标记中包含 "g",用以置换同一行文本内出现的所有的匹配词 "x_cnt"。
标记 "e" 用于避免因文件中找不到 "x_cnt" 而出现错误信息。
否则 ":argdo" 命令就会在遇到第一个找不到 "x_cnt" 的文件时中断。
字符 "|" 分隔两条命令。后面的 "update" 命令将那些有改动的文件存盘。
如果没有 "x_cnt" 被改成 "x_counter",这个命令什么也不做。
还有一个 ":windo" 命令,用于在所有视窗内执行其参数所规定的命令。
以及 ":bufdo"命令,对所有缓冲执行其参数所规定的命令。
使用中要小心,因为你在缓冲列表中的文件数量可能超过你能想像的。
请用 ":buffers" 命令 (或 ":ls") 来检查缓冲列表。
可以在命令行下进行替换,
仍然以vi方法中的例子进行讲解,把c文件中的"x_cnt" 改为 "x_counter"。

2 perl

可以执行以下命令:
find . -name '*.c' -print0 | xargs -0 perl -pi -e 's/x_cnt/x_counter/g' 
xargs 把find命令的结果作为perl的参数。
find的参数-print0和xargs的参数-0是防止文件名中有空格或新行造成错误,可以man xargs获得帮助。
注意: 如果替换的字符包括 ()[]/"'!? 等等这样的特殊字符,你必须在字符前加上反斜杠\ 。
这种方法的好处是不用启动编辑器,比较迅速。缺点是容易出现不想要的替换,例如:把px_cnt替换成了px_counter。


3 sed

仍以上面的例子讲解:
find . -name "*.c" -print0 | xargs -0 sed -i 's/x_cnt/x_counter/g'
优缺点和perl方法相同。 
以上方法的差异只在于使用工具的不同,相信肯定还有别的工具能办到这件事。
比如emacs,肯定也能做到这些,只是因为我不用emacs,所以不熟悉。
希望大家总结自己得心应手的方法。