2.3 sed-增加air
命令 |
含义 |
a |
append追加,向指定的每一行追加内容(行后面)>> |
i |
insert插入,向指定的每一行插入内容(行前面) |
r |
在行后增加文件内容 |
[root@localhost data]# cat users.txt 1,zhangsan 2,lisi 3,wangwu 4,zhaoliu 5,qianqi 6,zhuba [root@localhost data]# sed '1a zhangsan996' users.txt 1,zhangsan zhangsan996 2,lisi 3,wangwu 4,zhaoliu 5,qianqi 6,zhuba [root@localhost data]# sed '1i zhangsan996' users.txt zhangsan996 1,zhangsan 2,lisi 3,wangwu 4,zhaoliu 5,qianqi 6,zhuba [root@localhost data]# sed '1r ip.txt' users.txt 1,zhangsan 192.168.109.1 192.168.109.2 192.168.109.3 192.168.109.4 192.168.109.5 2,lisi 3,wangwu 4,zhaoliu 5,qianqi 6,zhuba
企业案例:向文件中追加多行内容
向config里面追加 UseDNS no GSSAPIAUTCATION no PermitRootLogin no #方法一 [root@localhost data]# touch config [root@localhost data]# cat >>config<<'EOF' > UseDNS no > GSSAPIAUTCATION no > PermitRootLogin no > EOF #方法二 [root@localhost data]# sed -i '$a UseDNS no\nGSSAPIAUTCATION no\nPermitRootLogin no' config
2.4 sed-替换scy
替换格式 |
s###g |
s///g |
sAAAg |
替换标记 |
含义 |
数字 |
表明新字符串将替换第几处匹配的地方 |
g |
表明新字符串将会替换所有匹配的地方 |
p |
打印与替换命令匹配的行,与-n一起使用 |
w文件 |
将替换的结果写到文件中 |
s |
字符串替换 |
c |
整行替换 |
y |
字符转换,转换前后的字符长度必须相同 |
分隔符不唯一,只有三个相同就行;
前两个分隔符之间支持正则;
不加g则是替换每一行第一个被匹配到的内容,g是全局的意思;
替换操作类似vim的末行模式;
#每一行的数字替换为空 [root@localhost data]# sed 's/[0-9]//g' users.txt ,zhangsan ,lisi ,wangwu ,zhaoliu ,qianqi ,zhuba #root替换为admin [root@localhost data]# sed -n 's/root/admin/p' passwd admin:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/admin:/sbin/nologin [root@localhost data]# sed -n 's/root/admin/2p' passwd root:x:0:0:admin:/root:/bin/bash #删除前面的所有0 [root@localhost data]# echo 000000001010|sed 's/^0*//' 1010 #给1-10行加上注释 [root@localhost data]# sed '1,10 s/^/#/' passwd #root:x:0:0:root:/root:/bin/bash #bin:x:1:1:bin:/bin:/sbin/nologin #daemon:x:2:2:daemon:/sbin:/sbin/nologin #adm:x:3:4:adm:/var/adm:/sbin/nologin #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #sync:x:5:0:sync:/sbin:/bin/sync #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown #halt:x:7:0:halt:/sbin:/sbin/halt #mail:x:8:12:mail:/var/spool/mail:/sbin/nologin #operator:x:11:0:operator:/root:/sbin/nologin ...... #将所有root开头的行注释 [root@localhost data]# sed -n 's/^root/#root/p' passwd #root:x:0:0:root:/root:/bin/bash [root@localhost data]# sed -n '/^root/ s/^/#/p' passwd #root:x:0:0:root:/root:/bin/bash #注释fstab文件中的swap行 [root@localhost data]# sed -n '/swap/ s/^/#/p' /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost data]# sed -n 's/.*swap.*/#&/p' /etc/fstab #/dev/mapper/centos-swap swap swap defaults 0 0 [root@localhost data]#
脚本
#使用脚本执行sed命令 [root@localhost data]# vim script.sed 1,10 s/^/#/ #1-10行注释 /root/ s/$/#/ #包括root的行后面加上井号
如同只用了多次-e操作
保存至文件
#保存替换的内容到新的文件中 [root@localhost data]# sed -n 's/root/admin/gp' passwd >out1.txt [root@localhost data]# cat out1.txt admin:x:0:0:admin:/admin:/bin/bash operator:x:11:0:operator:/admin:/sbin/nologin [root@localhost data]# sed -n 's/root/admin/w out2.txt' passwd [root@localhost data]# cat out2.txt admin:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/admin:/sbin/nologin [root@localhost data]#
思考
sed 's9\945\9\99\98\939g' 1.txt #这行命令是谁替换谁 9\945\9\99\98\939 #前面说过,分隔符是三个一样的字符就可以,可以看出分隔符是9而\是转义字符 #去掉三个没有转义的9就是下面的样子 94599 9893 #所以是94599替换成9893
后向使用,反向使用(先保护再使用)
#要实现这两种内容的转变 [root@localhost data]# echo 123456 123456 [root@localhost data]# echo '<123456>' <123456> #前后交换 [root@localhost data]# echo old_new |sed -r 's#(^.*)_(.*$)#\2_\1#g' new_old
(old)_(new)
\1_\2
c/y
[root@localhost data]# sed '1c zhangsan996' users.txt zhangsan996 2,lisi 3,wangwu 4,zhaoliu 5,qianqi 6,zhuba #使用y转换 [root@localhost data]# sed 'y/zhangsan/zzzzzzzz/' users.txt 1,zzzzzzzz 2,lizi 3,wzzzwu 4,zzzoliu 5,qizzqi 6,zzubz [root@localhost data]# sed 'y/zhangsan/zzzzzzz/' users.txt sed:-e 表达式 #1,字符 19:“y”命令的字符串长度不同 [root@localhost data]# #使用tr替换 [root@localhost data]# cat users.txt |tr 'zhangsan' 'zzzzzzzz' 1,zzzzzzzz 2,lizi 3,wzzzwu 4,zzzoliu 5,qizzqi 6,zzubz [root@localhost data]# cat users.txt |tr 'zhangsan' 'zzzz' 1,zzzzzzzz 2,lizi 3,wzzzwu 4,zzzoliu 5,qizzqi 6,zzubz
2.5 sed-剪切H-粘贴G
#将1-3行剪切并粘贴到最后 [root@localhost data]# sed '1,3 {H;d};$G' users.txt 4,zhaoliu 5,qianqi 6,zhuba 1,zhangsan 2,lisi 3,wangwu
总结
sed执行多条命令的方式:
sed -n -e '命令1' -e '命令2' 文件 sed -n -e '命令1;命令2' 文件 sed -n ' 命令1 命令2 ...... ' 文件
sed对指定行操作:
以数字形式表示行区间
用字符串来过滤行
s/OLD/NEW/2 代表对每行第二个匹配到的字符串进行替换
g 代表对每行所有能匹配到的字符进行替换
p 可以结合-n 选项只打印替换的行内容
w 可以把替换的行内容保存到指定的文件中
n,m s/OLD/NEW/
/字符串+正则/ s/OLD/NEW
s/^/添加的字符/ 行首添加内容
s/$/添加的字符/ 行尾添加内容
sed -f 文件 可以在文件中定义多条操作规则
sed替换命令的字符串分隔符,就看s后面跟的字符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符则需要使用\来转义
sed -i 可以直接修改文件内容,操作前建议先验证命令和备份目标文件
增删改查
删d
改s(字符串替换) c(整行替换) y(对应字符串替换,效率类似tr)
查p
增 a(在行后)i(在行前)r(在行后读入文件内容)
复制粘贴 H;G