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 波浪线作用

 

 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
View Code

 

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

 

posted @ 2018-02-24 13:34  Star-Hitian  阅读(153)  评论(0)    收藏  举报