知足却不乏追求
分类: LINUX
2015-04-02 10:29:17
此文为转贴:
方法有二:
(一)通过vi编辑器来替换。
参考博文:
http://kingaragorn.javaeye.com/blog/467308
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用编辑软件进行替换,今天发现该命令有很多种写法(vi
真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
:s/well/good/ 替换当前行第一个 well 为 good
:s/well/good/g 替换当前行所有 well 为
good
:n,$s/well/good/ 替换第 n 行开始到最后一行中每一行的第一个 well 为
good
:n,$s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 good
n 为数字,若 n
为 .,表示从当前行开始到最后一行
:%s/well/good/(等同于 :g/well/s//good/) 替换每一行的第一个 well 为
good
:%s/well/good/g(等同于 :g/well/s//good/g)替换每一行中所有
well 为 good
可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#well/#good/#
替换当前行第一个 well/ 为
good/
:%s#/usr/bin#/bin#g
可以把文件中所有路径/usr/bin换成/bin
(二)Sumly法直接替换文件中的字符串。(此法不用打开文件即可替换字符串,而且可以批量替换多个文件。)
参考博文: http://easytech.javaeye.com/blog/316948
例1
执行命令:
perl -p -i -e "s/China/Sumly/g" /www/*.htm
/www/*.txt
上面的意思是说将www文件夹下所有的htm和txt文件中的“China”都替换为“Sumly”
例2
执行命令:
perl -p -i -e "s/memory_production/memory_production2/g" ./*.sql
上面的意思是将当前目录下所有的sql文件中的“memory_production”替换成“memory_production2”
======================================
linux sed
批量替换多个文件中的字符串
linux下批量替换文件内容 1、网络上现成的资料
格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
Svn中文网
linux sed 批量替换多个文件中的字符串
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
例如:替换/home下所有文件中的为admin99.net Bbs.Svn8.Com
sed -i "s//admin99.net/g" `grep -rl /home`
exp:sed -i "s/shabi/$/g" `grep shabi -rl ./` Svn8.Com
2、自己额外附加 Svn8.Com
2.1 将文件1.txt内的文字“garden”替换成“mirGarden”
# sed -i "s/garden/mirGarden/g" 1.txt //sed -i 很简单
2.2 将当前目录下的所有文件内的“garden”替换成“mirGarden”
## sed -i "s/garden/mirGarden/g" `ls` //其实也就是ls出多个文件名而已
*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
==================
Linux
sed批量替换多个字符串
比如,要将目录/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'