sed sed批量替换文件内容 & 为 &

积少成多,聚沙成塔,集腋成裘
sed 替换 目录 文件 某个特定字符
替换字符命令
sed -i "s/drawable/mipmap/g" `grep drawable -rl ./`
grep drawable -rl ./ 表示查找当前文件夹下包含 drawable 字符的所有文件
sed -i "s/drawable/mipmap/g" input_file 表示将 input_file 中的 drawable 字符替换为 mipmap
扫码向博主提问
非学,无以致疑;非问,无以广识
没有更多推荐了,sed -i s/"str1"/"str2"/g `grep "str1" -rl --include="*.[ch]" ./`
将当前目录下的所有.c、.h文件中的str1字符串替换为str2字符串。
参数解释: sed:-i 表示操作的是文件,``括起来的grep命令,表示将grep命令的的结果作为操作文件s/"str1"/"str2"/表示查找str1并替换为str2,后面跟g表示一行中有多个str1的时候,都替换,而不是仅替换第一个
grep:-r表示查找当前目录以及所有子目录-l表示仅列出符合条件的文件名,传给sed命令做替换操作--include="*.[ch]" 表示仅查找.c、.h文件
注:如果不需要查找子目录,仅需要在当前目录替换,可直接用sed命令:
sed -i s/"str1"/"str2"/g ./*.[ch]
阅读(...) 评论()架构师、脚本语言专家;精通Python、Shell、正则表达式;熟悉Java、C、Tcl、Ruby、Scala、Perl等多种编程语言;在性能,开源,自动化测试方面有非常丰富的经验...
sed中的&在字符串拆分的妙用
有一个字符串'',如何在Shell中拆分为12 34 56 78 90,以空格分开,似乎不太好整,但如果使用sed,方法会很巧妙。echo "" | sed 's/../&\ /g's///g
是sed中替换的格式..
代表任意两个字符&
代表前面两个字符\
空格前面加反斜杠转义,相当于在两个字符后面添加了一个空格上面的方式,可谓非常之巧妙!在Python里面,用切片的方式处理起来可能会方便些&&& S = ""
&&& ' '.join([S[i:i+2] for i in range(0,len(S),2)])
'12 34 56 78 90'
&&& 经过切片操作,处理起来同样非常巧妙。
没有更多推荐了,shell&&文件内容替换&sed用法
调用sed命令有两种形式:
sed [options] 'command'
sed [options] -f scriptfile
删除:d命令&
$ sed '2d'
example-----删除example文件的第二行。
sed '2,$d' example-----删除example文件的第二行到末尾所有行。
$ sed '$d'
example-----删除example文件的最后一行。
'/test/'d example-----删除example文件所有包含test的行。
's/要被替换的字符串/新的字符串/g'
$ sed 's/test/mytest/g'
example-----在整行范围内把test替换为mytest。
如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
#!/bin/bash
's/172.30.0.122:1521:iboxpay/要替换的IP:端口:实例/g'
/home/wdk/proxool.xml
sed -i 's/"tst"/要替换的数据库用户名/g'
/home/wdk/proxool.xml
sed -i 's/"ok"/要替换的数据库密码/g'
/home/wdk/proxool.xml
/home/wdk/proxool.xml
's/被替换的内容/要替换成的内容/' file & &
& &-i 直接修改并保存
# nl /etc/passwd | sed '2,5d'
&删除2~5行
# nl /etc/passwd | sed '3,$d'
&删除3~最后一行 & &
& $代表最后一行
# nl /etc/passwd | sed '2a drink tea?'
& 在第二行之后加入“drink tea?”
/etc/passwd | sed '2i drink tea?' &
&在第二行之前加入”drink tea?“
/etc/passwd | sed '2a drink
tea?\ & 在第二行之后加入“drink tea?”并以“\”结束,回车后
& drink beer
?\ & &在“drink tea?”后加入一行
以“ \ ”结束
# &nl /etc/passwd | sed '2,5c
NO 2-5 NUMBER' & &
将第2~5行的内容替换为“NO 2-5 NUMBER”
$ sed -n 's/^test/mytest/p'
-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
's/^192.168.0.1/&localhost/'
-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加
localhost,变成192.168.0.1localhost。
$ sed -n 's//(love/)able//1rs/p'
-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed 's#10#100#g'
-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号&
$ sed -n '/test/,/check/p'
-----所有在模板test和check所确定的范围内的行都被打印。
'5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
多点编辑:e命令&
$ sed -e '1,5d' -e 's/test/check/'
example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执
行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
--expression='s/test/check/' --expression='/love/d'
-----一个比-e更好的命令是--expression。它能给sed表达式赋值。
从文件读入:r命令&
$ sed '/test/r file'
-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令&
$ sed -n '/test/w
file' example
-----在example中所有包含test的行都被写入file里。
追加命令:a命令&
$ sed '/^test/a//---&this is a example'
example&-----'this is a
example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
插入:i命令&
$ sed '/test/i//&
-------------------------' example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
下一个:n命令&
$ sed '/test/{ s/aa/bb/; }'
example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。
变形:y命令&
$ sed '1,10y/abcde/ABCDE/'
example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
退出:q命令&
$ sed '10q' example-----打印完第10行后,退出sed。
保持和获取:h命令和G命令&
$ sed -e '/test/h' -e '$G
example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将
打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保
持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中
的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
保持和互换:h命令和x命令&
$ sed -e '/test/h' -e '/check/x' example
-----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
比如,如果要打印出含有字串”1024”的行,我就可能会用:
cat filename | sed &n ‘/1024/p’
&sed /^$/d filename
& &可以删除文件中的空行。
sed /^[[:space:]]*$/d filename &
&可以删除内容为多个空格/tab组成的行。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。sed替换命令 - Lucky_7 - 博客园
随笔 - 92, 文章 - 1, 评论 - 4, 引用 - 0
sed替换命令
sed ‘ [ address-range | pattern-range ] s/original-string/replacement-string/[substitute-flags] ’input-file
l address-range或pattern-range(即地址范围和模式范围)是可选的,如果没有指定,那么sed将在所有行上进行替换
l s即执行替换命令substitute
l original-string是被sed搜索然后被替换的字符串,它可以是一个正则表达式
l replacement-sting替换后的字符串
l substitute-flags是可选的,下面会具体解释
下面列举一些示例
用Directory替换所有行中的Manager
[root@sishen ~]# sed 's/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Director
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director
只把包含Sales的行中的Manager替换为Director
[root@sishen ~]# sed '/Sales/s/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director
全局标志 g
g代表全局(global)默认情况下,sed会替换每行中第一次出现的original-string,如果你要替换每行中出现的所有original-string,就需要用g
示例 用大写A替换第一次出现的小写字母a
[root@sishen ~]# sed 's/a/A/' employee.txt
101,John Doe,CEO
102,JAson Smith,IT Manager
103,RAj Reddy,Sysadmin
104,AnAnd Ram,Developer
105,JAne Miller,Sales Manager
把所有小写字母a替换为大写字母A
[root@sishen ~]# sed 's/a/A/g' employee.txt
101,John Doe,CEO
102,JAson Smith,IT MAnAger
103,RAj Reddy,SysAdmin
104,AnAnd RAm,Developer
105,JAne Miller,SAles ManAger
注意上述例子会在所有行上进行替换,因为没有指定地址范围
数字标志(1,2,3,·····)
使用数字可以指定original-string出现的次序,只有第n次出现的original-string才会触发替换,每行数字从1开始,最大为512
比如/11会替换每行中第11次出现的original-string
把第二次出现的小写字母a替换为大写字母A
[root@sishen ~]# sed 's/a/A/2' employee.txt
101,John Doe,CEO
102,Jason Smith,IT MAnager
103,Raj Reddy,SysAdmin
104,Anand RAm,Developer
105,Jane Miller,SAles Manager
为了方便以下示例,首先建立如下文件
[root@sishen ~]# vim substitute-locate.txt
locate command is used to locate files
locate command uses datebases to locate files
locate command can also use regex for searching
把每行中第二次出的locate替换为find
[root@sishen ~]# sed 's/locate/find/2' substitute-locate.txt
locate command is used to find files
lcaote command uses datebases to locate files
locate command can also use regex for searching
打印标志p(print)
只打印替换后的行
[root@sishen ~]# sed -n 's/John/Johnny/p' employee.txt
101,Johnny Doe,CEO
在之前的数字标志的例子中使用/2来替换第二次出现的locate。第3行中locate只出现了一次所以没有替换任何内容,使用p标志可以只打印替换过的两行
[root@sishen ~]# sed -n 's/locate/find/2p' substitute-locate.txt
locate command is used to find files
locate command uses datebases to find files
[root@sishen ~]#
只把替换后的内容写入到out6.txt文件中
[root@sishen ~]# sed -n 's/John/Johnny/w out6.txt' employee.txt
[root@sishen ~]# cat out6.txt
101,Johnny Doe,CEO
把每行中第二次出现的locate替换为find,把替换后的结果保存到文件中,同时显示输入文件所有内容
[root@sishen ~]# sed 's/locate/find/2w out7.txt' substitute-locate.txt
locate command is used to find files
locate command uses datebases to find files
locate command can also use regex for searching
[root@sishen ~]# cat out7.txt
locate command is used to find files
locate command uses datebases to find files
[root@sishen ~]# sed -n 's/locate/find/2w out7.txt' substitute-locate.txt
[root@sishen ~]# cat out7.txt
locate command is used to find files
locate command uses datebases to find files
[root@sishen ~]#
注意加上-n参数就不会输出显示在屏幕上
忽略大小写标志i(ignore)
[root@sishen ~]# sed 's/john/Johnny/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
加上-i参数后才可以实现替换
[root@sishen ~]# sed 's/john/Johnny/i' employee.txt
101,Johnny Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
执行命令标志w(excuate)
首先建立文件bash-file.txt
[root@sishen ~]# cat bash-file.txt
/etc/passwd
/etc/group
在bash-file.txt文件中的每行前面添加 ls -l 并打印结果
[root@sishen ~]# sed 's/^/ls -l/' bash-file.txt
ls -l/etc/passwd
ls -l/etc/group
在bash-file文件中的每行前面添加ls -l 并把结果作为命令执行
[root@sishen ~]# sed 's/^/ls -l /e' bash-file.txt
-rw-r--r-- 1 root root 1623 Oct 12 10:23 /etc/passwd
-rw-r--r-- 1 root root 818 Oct 12 10:23 /etc/group
使用替换标志组合
使用g,I,p和w的组合
下面的例子将把每行中出现的所有Manager或manager替换为Directory。然后把替换后的内容打印到屏幕上,同时把这些内容保存到out8.txt文件中
[root@sishen ~]# sed -n 's/manager/Director/igpw out8.txt' employee.txt
102,Jason Smith,IT Director
105,Jane Miller,Sales Director
sed替换命令分界符
首先新建一个文件path.txt
reading /usr/local/bin directory
限制使用sed把/usr/local/bin替换为/usr/bin,在下面的例子中,sed默认的分界符/都被\转义
[root@sishen ~]# sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt
reading /usr/bin directory
这样虽然实现了替换,但是操作中很繁琐,所以你可以使用任何一个字符(包括字母,但是不建议这样做)
作为sed替换命令的分界符。如 | 或 ^ 或!如
[root@sishen ~]# sed 'sA/usr/local/bin/A/usr/bin/A' path.txt
reading /usr/local/bin directory
[root@sishen ~]# sed 's|/usr/local/bin|/usr/bin|' path.txt
reading /usr/bin directory
[root@sishen ~]# sed 's@/usr/local/bin@/usr/bin/@' path.txt
reading /usr/bin/ directory
[root@sishen ~]# sed 's^/usr/local/bin^/usr/bin^' path.txt
reading /usr/bin directory
[root@sishen ~]# sed 's!/usr/local/bin!/usr/bin!' path.txt
reading /usr/bin directory
结果都一样,看自己喜好了
单行内容以上执行多个命令
下面的例子演示了在模式空间内执行两个替换命令的过程
[root@sishen ~]# sed '{
& s/Developer/IT Manager/
& s/Manager/Director/
& }' employee.txt #注意空格
101,John Doe,CEO
102,Jason Smith,IT Director
103,Raj Reddy,Sysadmin
104,Anand Ram,IT Director
105,Jane Miller,Sales Director
分析第4行执行过程
1. 读取数据:在这一步,sed读取内容到模式空间,此时模式空间的内容为:
104,Ananda Ram,Developer
2. 执行命令:第一个命令,s/Developer/IT Manager/执行后,模式空间的内容为:
104,Anand Ram,IT Manager
现在在模式空间上执行第二个命令s/Manager/Director/,执行后,模式空间内容为:
104,Ananda Ram,IT Director
谨记:sed在第一个命令执行的结果上,执行第二个命令
3. 打印内容:打印当前模式空间的内容,如下
104,Ananda Ram,IT Director
4. 重复循环:移动到输入文件的下一行,然后重复执行第一步,即读取数据
&的作用----获取匹配到的模式
挡在replacement-string中使用&时,它会被替换成匹配到的original-string或正则表达式,这是个很有用的东西
给雇员ID(即第一列的3个数字)加上[ ],如101改成[101]
[root@sishen ~]# sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt
[101],John Doe,CEO
[102],Jason Smith,IT Manager
[103],Raj Reddy,Sysadmin
[104],Anand Ram,Developer
[105],Jane Miller,Sales Manager
把每一行放进&&中
[root@sishen ~]# sed 's/^.*/&&&/' employee.txt
&101,John Doe,CEO&
&102,Jason Smith,IT Manager&
&103,Raj Reddy,Sysadmin&
&104,Anand Ram,Developer&
&105,Jane Miller,Sales Manager&
分组替换(单个分组)
跟正则表达式中一样,sed中也可以使用分组,分组以\(开始,以\)结束,分组可以用在回溯引用中,
回溯引用即重新使用分组所选择的部分正则表达式,在sed替换命令的replacement-string中和正则表达式中,都可以使用回溯引用,
[root@sishen ~]# sed 's/\([^,]*\).*/\1/g' employee.txt
上面例子中:
l 正则表达式\([^,0]*/)匹配字符串从开头到一个逗号之间的所有字符(并将其放入第一个分组中)
l Replacement-string中的\1将代替匹配到的分组
l g 即是全局标志
下面例子只会显示/etc/passwd的第一列,即用户名
[root@sishen ~]# sed 's/\([^:]*\).*/\1/' /etc/passwd
首先建立下面文件,以便使用
[root@sishen ~]# vim number.txt
格式化输出,增加可读性
[root@sishen ~]# sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' number.txt
分组替换(多个分组)
可以使用多个\和(\)
划分多个分组,使用多个分组时,需要在replacement-string中使用\n来指定第n个分组,如下面的示例如只打印第一列(雇员ID)和第3列(雇员职位)
[root@sishen ~]# sed 's/^\([^,]*\),\([^,]*\),\([^,*]\)/\1,\3/' employee.txt
102,IT Manager
103,Sysadmin
104,Developer
105,Sales Manager
在这个例子中可以看到,original-string中,划分了3个分组,以逗号分隔
l ([^,]*\)第一个分组,匹配雇员ID
l ,为字段分隔符
l ([^,]*\)为第二个分组,匹配雇员姓名
l ,为字段分割符,上面的例子演示了如何使用分组
l \1代表第一个分组,(雇员ID)
l ,出现在第一个分组之后的逗号
l \3代表第二个分组(雇员职位)
注意:sed最多能处理9个分组,分别用\1至\9表示
交换第一列(雇员ID)和第二列(雇员姓名)
[root@sishen ~]# sed 's/^\([^,]*\),\([^,]*\),\([^,]*\)/\2,\1,\3/' employee.txt
John Doe,101,CEO
Jason Smith,102,IT Manager
Raj Reddy,103,Sysadmin
Anand Ram,104,Developer
Jane Miller,105,Sales Manager
sed专有的替换标志
\l 标志(小写的 L,理解为lower)
当在replacement-string中使用\l标志时,它会把紧跟在其后的字符当作小写字符来处理,如你所知,下面的例子将把John换成JOHNNY:
[root@sishen ~]# sed -n 's/John/JOHNNY/p' employee.txt
101,JOHNNY Doe,CEO
下面的例子将把JOHNNY 中的H换成h
[root@sishen ~]# sed -n 's/John/JO\lHNNY/p' employee.txt
101,JOhNNY Doe,CEO
当在replacement-string中使用\L标志时,它会把后面所有的字符都当小写字符来处理,例如:
在replacement-string中的H前放置了\L 标志,它会把H和它后面的所有字符都换成小写:
[root@sishen ~]# sed -n 's/John/JO\LHNNY/p' employee.txt
101,JOhnny Doe,CEO
\u标志(理解为upper)和\l类似,只不过是把字符换成大写,当在replacemen-string中使用\u标志时,它会把紧跟其后的字符当作大写字符来处理,下面的例子中,replacement-string里面的h前面有\u的标志,所以h将被换成大写的H:
[root@sishen ~]# sed -n 's/John/jo\uhnny/p' employee.txt
101,joHnny Doe,CEO
当在replacement-string中使用\U标志时,它会把后面所有的字符都当作大写字符来处理。如下:replacement-string里面的h前面有U的标志,所以h及其后的所有字符都将被换成大写:
[root@sishen ~]# sed -n 's/John/jo\Uhnny/p' employee.txt
101,joHNNY Doe,CEO
\E标志(理解为exit)
\E标志需要和\U或者\L一起使用,他将关闭\U或\L的功能,例如将字符串“Johnny Boy”的每个字符都以大写的形式打印出来,因为在replacement-string前面使用了\U标志
[root@sishen ~]# sed -n 's/John/\UJohnny Boy/p' employee.txt
101,JOHNNY BOY Doe,CEO
下面将把John换成JOHNNY Boy
[root@sishen ~]# sed -n 's/John/\UJohnny\E Boy/p' employee.txt
101,JOHNNY Boy Doe,CEO
因为在Johnny后面使用了\E标志,关闭了\U的功能
替换标志的用法
如下将雇员ID都显示为大写,职位都显示为小写:
[root@sishen ~]# sed 's/\([^,]*\),\([^,]*\),\([^,]*\)/\U\2\E,\1,\L\3/' employee.txt
JOHN DOE,101,ceo
JASON SMITH,102,it manager
RAJ REDDY,103,sysadmin
ANAND RAM,104,developer
JANE MILLER,105,sales manager
这个例子中
l \U\2\3把第二个分组转换为大写,然后使用\E关闭转换
l \L\3 把第三分组转换为小写

我要回帖

更多关于 sed命令替换 的文章

 

随机推荐