sed 小结(一)
sed 波浪线作用:
liulei@DESKTOP-FCVTDJV ~ $ seq 10 1 2 3 4 5 6 7 8 9 10 liulei@DESKTOP-FCVTDJV ~ $ seq 10 | sed -n '1~2p' 1 3 5 7 9 liulei@DESKTOP-FCVTDJV ~ $ seq 10 | sed -n '2~2p' 2 4 6 8 10 备注: '2~2p' 就是以2开头,长度是2的等差数列显示出来
sed -i 替换时备份:
[root@CentOS6-M01 ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 10,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO [root@CentOS6-M01 ~]# sed -i.bak 's#CTO#NB#g' person.txt [root@CentOS6-M01 ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,NB 10,zhangyao,NB 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO [root@CentOS6-M01 ~]# cat person.txt.bak 101,oldboy,CEO 102,zhangyao,CTO 10,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO
备注:可以看到,源文件中指定字节被替换,并生成一个备份文件
sed 替换命令s详解:
sed -i 's#[被替换的字符串]#[替换后的字符串]#g' person.txt sed '[address-range]|[pattern-range] s#original-string#replacement-string#[substitute-flags]' [input file] sed '[地址范围|模式范围] s#[被替换的字符串]#[替换后的字符串]#[替换标志]' [输入文件] 替换标志:g全局标志 数字标志1,2,3,,, 打印p 写w 忽略大小写i 执行命令标志e
Ms# # #Ng Ms 对第M行操作 无g标志 对匹配的第1列处理 有g,对这一行操作 Ng 从第N处/列开始替换 Ms Ng 对第M行从第N个处匹配替换
数字标志X X 只对第X处/列替换 1<X<512
sed p 打印 [root@m01 test]# sed -n 's#zhangyao#NB#p' person.txt 102,NB,CTO ~~~~~~~~~~~~~~~~~~~ w 文件另存,保存,写 [root@m01 test]# sed -n 's#zhangyao#NB#; w output.txt' person.txt [root@m01 test]# cat output.txt 101,oldboy,CEO 102,NB,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO [root@m01 test]# sed -n 's#zhangyao#NB# w output.txt' person.txt [root@m01 test]# cat output.txt 102,NB,CTO ~~~~~~~~~~~~~~~~ i 忽略大小写 [root@m01 test]# sed 's#alex#NB#i' person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,NB,COO 104,yy,CFO 105,feixue,CIO [root@m01 test]# cat person.txt 101,oldboy,CEO 102,zhangyao,CTO 103,Alex,COO 104,yy,CFO 105,feixue,CIO ~~~~~~~~~~~~~~~~~~~~~~~~ e 执行命令标志 [root@m01 test]# sed 's#^#ls -lh #e' file.txt -rw-r--r--. 1 root root 251 1月 27 2017 /etc/my.cnf -rw-r--r-- 1 root root 1.4K 12月 30 00:14 /etc/passwd [root@m01 test]# cat file.txt /etc/my.cnf /etc/passwd ~~~~~~~~~~~~~~~~~~~~~~~~
如下测试:
[root@CentOS6-M01 test]# cat num.txt 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [root@CentOS6-M01 test]# sed '2s#1#0#' num.txt 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [root@CentOS6-M01 test]# sed '2s#1#0#g' num.txt 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 [root@CentOS6-M01 test]# sed '2s#1#0#2g' num.txt 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 [root@CentOS6-M01 test]# sed '2,3s#1#0#2g' num.txt 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 [root@CentOS6-M01 test]# sed 's#1#0#2g' num.txt 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
sed 不常用的标志

简单举例如下:
[root@CentOS6-M01 test]# echo This is what | sed -r 's#(.*) (.*) (.*)#\l\3 \2 \U\1#' what is THIS
sed 获取行号
简单举例如下:
[root@CentOS6-M01 ~]# sed '=' person.txt | sed 'N;s#\n# #' 1 101,oldboy,CEO 2 102,zhangyao,NB 3 10,zhangyao,NB 4 103,Alex,COO 5 104,yy,CFO 6 105,feixue,CIO 7 106,Alex,COO
sed 一条语句执行多条命令
简单举例如下:
#要求 #删除第三行到末尾的数字。并把10替换为01。 [root@CentOS6-M01 ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,NB 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO [root@CentOS6-M01 ~]# sed '3,$d' person.txt | sed 's#10#01#g' 011,oldboy,CEO 012,zhangyao,NB [root@CentOS6-M01 ~]# sed -e '3,$d' -e 's#10#01#g' person.txt 011,oldboy,CEO 012,zhangyao,NB
[root@CentOS6-M01 ~]# sed '3,$d;s#10#01#g' person.txt
011,oldboy,CEO
012,zhangyao,NB
[root@CentOS6-M01 ~]# cat person.sed
3,$d
s#10#01#g
[root@CentOS6-M01 ~]# sed -f person.sed person.txt
011,oldboy,CEO
012,zhangyao,NB
出个小题目,自己测试下:
#一个文件100行,把5,35,70行单独拿出来 类似于这样: [root@CentOS6-M01 ~]# sed -n '2p;3p;6p' person.txt 102,zhangyao,NB 103,Alex,COO 106,Alex,COO
sed 中特殊符号 {}
[root@CentOS6-M01 ~]# sed -n '2,4p;=' person.txt 1 102,zhangyao,NB 2 103,Alex,COO 3 104,yy,CFO 4 5 6 [root@CentOS6-M01 ~]# sed -n '2,4{p;=}' person.txt 102,zhangyao,NB 2 103,Alex,COO 3 104,yy,CFO 4
备注:相当于 p 和 = 针对于第二行到第四行执行。
sed 中打印不可见字符 l
[root@CentOS6-M01 ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,NB
103, Alex,COO
104,yy,CFO
105,feixue,CIO
106,Alex,COO
[root@CentOS6-M01 ~]# sed -n 'l' person.txt
101,oldboy,CEO$
102,zhangyao,NB$
103,\tAlex,COO$
$
104,yy,CFO$
105,feixue,CIO$
106,Alex,COO$
sed 中的大小写替换
[root@CentOS6-M01 ~]# cat person.txt 101,oldboy,CEO 102,zhangyao,NB 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO [root@CentOS6-M01 ~]# sed 'y#CO#co#' person.txt 101,oldboy,cEo 102,zhangyao,NB 103,Alex,coo 104,yy,cFo 105,feixue,cIo 106,Alex,coo
sed 命令的推出 q
[root@CentOS6-M01 ~]# sed 'q' person.txt 101,oldboy,CEO [root@CentOS6-M01 ~]# sed '3q' person.txt 101,oldboy,CEO 102,zhangyao,NB 103,Alex,COO
sed 从文件读取数据
#相当于合并两个文件 [root@CentOS6-M01 test]# sed '$r num.txt' person.txt 101,oldboy,CEO 102,zhangyao,NB 103,Alex,COO 104,yy,CFO 105,feixue,CIO 106,Alex,COO 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/articles/8465386.html

浙公网安备 33010602011771号