linux多个文件替换,转帖-Linux下如何同时替换多个文件中的文本或字符串

作者:吉庆( qingfang0515@sina.com )

主页:http://hi.baidu.com/jiqing0925

转载请保留作者信息。

-------------------

做一件比较复杂的事通常存在多种方法。

一次性替换多个文件中的文本是我们常遇到的问题,下面是解决这个问题的三种方法:

1. vi 方法

参见vim用户手册26.

*26.3* 改动多个文件

假定你有个变量名为 x_cnt 而你要把他改为 x_counter。

这个变量在多个 C 文件都被用到了。你需要在所有文件中作此改动。你得这么做。

把所有相关文件放进参数列表:

:args *.c

这个命令会找到所有的 C 文件并编辑其中的第一个。

现在你可以对所有这些文件执行置换命令:

:argdo %s/\/x_counter/ge | update

命令 :argdo 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。

作为参数的替换命令 %s 作用于所有文本行。它用 \ 来查找x_cnt。

\< 和 \> 用来指定仅匹配那些完整的词,而不是 px_cnt 或x_cnt2。

替换命令的标记中包含 g,用以置换同一行文本内出现的所有的匹配词 x_cnt。

标记 e 用于避免因文件中找不到 x_cnt 而出现错误信息。

否则 :argdo 命令就会在遇到第一个找不到 x_cnt 的文件时中断。

字符 | 分隔两条命令。后面的 update 命令将那些有改动的文件存盘。

如果没有 x_cnt 被改成 x_counter,这个命令什么也不做。

还有一个 :windo 命令,用于在所有视窗内执行其参数所规定的命令。

以及 :bufdo命令,对所有缓冲执行其参数所规定的命令。

使用中要小心,因为你在缓冲列表中的文件数量可能超过你能想像的。

请用 :buffers 命令 (或 :ls) 来检查缓冲列表。

2. perl方法

可以在命令行下进行替换,

仍然以vi方法中的例子进行讲解,把c文件中的x_cnt 改为 x_counter。

可以执行以下命令:

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,所以不熟悉。

希望大家总结自己得心应手的方法。

==================

Linux sed批量替换多个字符串

http://www.itqun.net/content-detail/105074.html

比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做:

sed -i s/zhangsan/lisi/g `grep zhangsan -rl /modules`

解释一下:

-i 表示inplace edit,就地修改文件

-r 表示搜索子目录

-l 表示输出匹配的文件名

这个命令组合很强大,要注意备份文件。

(1)sed 'y/1234567890/abCDEFGHIJ/' test_sed

sed 'y/1234567890/abCDEFGHIJ/' filename

abCDEFGHIJ

BCDEFGHIJA

CDEFGHIJAB

DEFGHIJABC

注意变换关系是按两个list的位置对应变换

其中:test_sed的内容是:

1234567890

2345678901

3456789012

4567890123

(2)替换每行所有匹配

sed 's/01/Ab/g' test_sed

1234567890

23456789Ab

3456789Ab2

456789Ab23

注意:第一行的0,1没有分别替换为A,b

删除:d命令

*

$ sed '2d' example-----删除example文件的第二行。

*

$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。

*

$ sed '$d' example-----删除example文件的最后一行。

*

$ sed '/test/'d example-----删除example文件所有包含test的行。

替换:s命令

*

$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

*

$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

*

$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。

*

$ sed -n 's/\(love\)able/\1rs/p'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值