本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。


6.3 单字符替换 y

使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错。

示例:

遇到n替换成2,遇到o替换成5。

[root@yuji ~]# sed 'y/no/25/' ff.txt      //遇到n替换成2,遇到o替换成5
 three
 seve2
 eight
 [root@yuji ~]# sed 'y/no/255/' ff.txt
 sed:-e 表达式 #1,字符 9:“y”命令的字符串长度不同
复制代码


image


7 sed 增加a i r


a:在行后添加内容

i:在行前插入内容

r:在行后读入文件内容

7.1 在行后添加内容a

示例1:在第一行下方添加一行内容

[root@yuji ~]# sed '1a 22' ff.txt      //在第一行下方添加一行内容
 22222
 three
 seven
 eight
复制代码


image


示例2:在第1~3行,每行下方添加一行内容

[root@yuji ~]# sed '1,3a 22' ff.txt     //在第1~3行,每行下方添加一行内容
 three
 seven
 eight
复制代码


image


示例3:在最后一行的下方,添加一行内容

[root@yuji ~]# sed '$a 22' ff.txt     //在最后一行的下方,添加一行内容
 three
 seven
 eight
复制代码


image


示例4:在第一行下方添加3行内容

[root@yuji ~]# sed '1a 22\n33\n44' ff.txt    //在第一行下方添加3行内容
 three
 seven
 eight
复制代码


image


7.2 在行前插入内容 i

示例:

[root@yuji ~]# sed '1i 77' ff.txt        //在第一行的上方,添加一行内容
 three
 seven
 eight
 [root@yuji ~]# sed '1,3i 77' ff.txt      //在第1~3行每行的上方,添加一行内容
 three
 seven
 eight
复制代码


image


7.3 在行后读入文件内容 r

示例:

[root@yuji ~]# cat hh.txt
 hello world
 [root@yuji ~]# sed '6r hh.txt' ff.txt    //在第6行下方读入hh.txt文件内容
 three
 hello world
 seven
 eight
复制代码


image


8 sed 复制粘贴

比较vi/vim编辑器和 sed编辑器:

#vi//vim编辑器:
 dd p  剪切 粘贴
 yy p  复制 粘贴
 :1,3 co 10  复制 粘贴(将第1~3行复制粘贴到第10行下方)
 :1,3 m 10   剪切 粘贴(将第1~3行剪切到第10行下方)
 #sed命令:
 H复制、d删除、G粘贴到指定行下方
复制代码


示例1:剪切粘贴

H复制,d删除,通过”复制后删除“来达到剪切的效果。

[root@yuji ~]# sed '1,3 {H;d};$G' ff.txt     //将第1~3行剪切粘贴到最后一行下方
 seven
 eight
 three
 [root@yuji ~]# sed '1,3 {H;d};5G' ff.txt     //将第1~3行剪切粘贴到第5行后面
 three
 seven
 eight
复制代码


image


示例2:复制粘贴

将1到3行复制粘贴到最后一行后面。(注意中间会多出一行空行)

[root@yuji ~]# sed '1,3 H;$G' ff.txt    //将1到3行复制粘贴到最后一行后面
 three
 seven
 eight
 three
复制代码


image


9 文件内容中的字符串进行互换

示例1:

#将2个字符串交换位置
 [root@yuji ~]# echo 111222333
 111222333
 [root@yuji ~]# echo 111222333|sed -r 's/(111)(222)/\2\1/'
 222111333
 #将3个字符串交换位置
 [root@yuji ~]# echo 111222333|sed -r 's/(111)(222)(333)/\3\2\1/'
 333222111
 #将第一个字符和最后一个字符进行互换
 [root@yuji ~]# echo 111222333|sed -r 's/^(.)(.*)(.)$/\3\2\1/'
 311222331
复制代码


image


image


示例2:

将abc123修改成123abc、321cba。

[root@yuji ~]# echo abc123| sed -r 's/(abc)(123)/\2\1/'
 123abc
 [root@yuji ~]# echo abc123| sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/'
 321cba
 [root@localhost ~]# echo abc123| sed -r 's/(a)(b)(c)(1)(2)(3)/\6\5\4\3\2\1/'
 321cba
复制代码


image


10 总结

1、sed的核心功能:增删改查(可配合正则表达式)

查: p
 改: s(字符串替换)、c(整行替换)、y(对应字符进行替换,效果类似tr命令)
 增: i(在行前插入内容)、a(在行后添加内容)、r(在行后读入文件的内容)
 复制粘贴:H(复制)、d(删除)、G(粘贴到指定行下方)
复制代码


2、sed对指定行操作:

  • 以数字形式表示行区间
  • 用字符串来过滤行

3、 sed -i 可以直接修改文件内容,操作前建议先验证命令和备份目标文件 。

4、删除空行的三种方法:

grep -v "^$"  file.txt        //过滤出非空行
 cat file.txt |tr -s "\n"      //压缩换行符
 sed  '/^$/d'  file.txt        //删除空行
复制代码


5、查找替换:

行范围 s/旧字符串/新字符串/替换标记
 s/旧字符串/新字符串/2  #代表对每行第二个匹配到的字符串进行替换
                  g  #代表对每行所有能匹配到的字符进行替换
                  p  #可以结合-n 选项只打印替换的行内容
                  w  #可以把替换的行内容保存到指定的文件中
 n,m s/旧字符串/新字符串/       #指定第n行到第m行,将旧字符串替换成新字符串
 /字符串+正则/ s/旧字符串/新字符串/    #过滤出想要的行,之后进行替换
 s/^/添加的字符/    #行首添加内容
 s/$/添加的字符/    #行尾添加内容
 sed -f 文件    #指定脚本文件来执行,可以在文件中定义多条操作规则
 sed指定字符串的分隔符,就看s后面跟的字符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符则需要使用\来转义。
 例如:s#/bin/bash#/sbin/nologin#g