linux三剑客之sed之妙

开篇之前,特此鸣谢慕课网 annieose老师的实例妙解Sed和Awk的秘密课程,课程地址
话不多少,直接干活。
sed是一种流处理编辑器,具体处理原理,如下图所示
sed处理流程图

处理原则:

1、sed一次只处理一行内容
2、sed不改变文件内容( 除非重定向 )

基本格式:

一、sed文本处理过程
1. 正则表达式选定文本调用sed操作命令进行处理
二、sed的格式
1. 命令行格式
1.1 sed [options] ‘command’ file(s)
1.1.1 options:-e ; -n
1.1.2 command:行定位(正则)+sed命令(操作)
1.1.3 例如:sed -n '/root/p'
1.1.4 例如:sed -e '10,20d' -e 's/false/true/g'
2. 脚本格式
2.1 sed -f scriptfile file(s)
一、基本操作命令
1. p命令:打印相关的行
1.1 sed 'p' passwd #会打印出两行,因为sed的原理是读入一行,输出一行,此处再加上p命令打印出来的一行,所以最后会打印出两行
1.2 sed -n 'p'passwd #加了-n选项之后,只会打印出相关的行,那些不相关的行则不会打印出来
二、行定位
1. 定位一行:x;(x为数字,行号的意思),/pattern/(pattern为正则表达式,正则两边加上//) sed命令第一个//内的为正则表达式,其他的//内的为字符串

例如:sed 's/^[a-Z]\+/root/' password 前一个//内的是正则表达式,后一个//内的是字符串
1.1 例如:sed -n '10p' passwd #通过行号定位,定位到第10行,并打印到屏幕但是无法看到行号
1.2 例如:nl passwd | sed -n '10p' #使用nl命令显示文件的行号,再通过管道传递给sed进行行处理。
1.3 例如:sed -n '/mooc/p' passwd #通过正则定位,定位含有mooc字符串这一行,并打印到屏幕
2. 定位几行:
2.1 x,y #(定位一个区间,x行到y行)
2.1.1 例如:nl passwd | sed -n '10,20p'
2.2 x,/pattern/ #(定位一个区间,x为开始的行号,pattren为结束的正则所表示的行)
2.2.1 例如:nl passwd | sed -n '10,/mooc/p'
2.3 /pattern1/,/pattern2/ #(定位一个区间,pattern1为开始的正则1所表示的行,pattern2为结束的正则2所表示的行)
2.3.1 例如:nl passwd | sed -n '/news/,/mooc/p'
2.4 “!” #感叹号,对所选的行进行取反
2.4.1 例如:nl passwd | sed -n '10!p'
2.4.2 例如:nl passwd | sed -n '10,20!p'
3.定位间隔几行:
3.1 first~step (first为开始的行,setp为步长也就是间隔几行)
3.1.1 例如:nl passwd | sed -n '1~2p' #定位从第1行开始,中间间隔2行的所有的行


以下是对整行进行操作

一、a 命令 #新增加一行,在所选行的下面新增一行,并输入内容
1. 命令格式:sed ‘行号+a命令+需要增加的内容’
2. 例如:nl passwd | sed '5a======' #在第5行的下面新增一行,并写入======这些内容
3. 例如:nl passwd | sed '1,5a======' #在第1-5行每一行下面都增加一行并写入同样的内容

二、i 命令 #新插入一行,在所选行的上面插入一行,并输入内容
1. 命令格式:sed ‘行号+i命令+需要插入的内容’
2. 例如:nl passwd | sed '5i======' #在第5行的上面插入一行,并写入======这些内容
3. 例如:nl passwd | sed '1,5i======'#在第1-5行每一行上面都插入一行并写入同样的内容

三、c 命令 #替换一行,将所选定的行的内容替换成需要替换的内容
1. 命令格式:sed ‘行号+c命令+需要替换的内容’
2. 例如:nl passwd | sed '5c======' #将第5行的内容替换成======这些内容
3. 例如:nl passwd | sed '1,5c======' #将1-5行整体的内容都替换成======这些内容

四、d 命令 #删除一行,将所选行的内容全部删除
1. 命令格式:sed ‘行号+d命令’
2. 例如:nl passwd | sed '5d' #将第5行的内容全部删除
六、案例二:文本处理
1. 目标:删除文本中的空行
2. 操作命令:sed '/^$/d' all.txt #删除文本中的空行


以下是对行内的元素进行操作

sed替换命令。
1.如果只是sed ‘s/旧字符/新字符’,那么就只会替换每行第一个遇到的旧字符
2. 因此要在最后加上g,表示全局,才会全部替换
案例获取ipconfig命令中的ip地址
ifconfig | sed -n '2p' | sed 's/inet.*r:/ /' | sed 's/B.*//'

sed命令高级操作:
1、{},多个sed命令,使用;号分割                            
例如:nl passwd | sed '{5,10d;s/nologin/login/g}' #显示行号,删除password文件的5到10行,并将该文件的nologin字段全部替换为login

2、 sed -n ‘起始行~行距(每次跳几行)’ 文件名
      sed 中的n命令表示调到下一行,
sed -n '{n;p}' 就可以表示先跳到下一行,然后再开始打印,结果就是输出所有的偶数行
例子:nl passwd | sed -n '{n;p}' #显示行号,输出password文件的偶数行
例子:nl passwd | sed -n '{p;n}' #显示行号,输出password文件的奇数行

sed -n ‘起始行~行距(每次跳几行)’ 文件名
例子: nl passwd | sed -n '1~2p' #显示行号,输出password文件的偶数行
例子: nl passwd | sed -n '2~2p' #显示行号,输出password文件的奇数行
3、&符号表示的是正则表达式匹配到的的内容

例如1:将password文件用户名后面拼接上空字符串,使其与后面的字符有空格间隔
sed 's/^[a-Z]\+/& /' passwd

例如2:将password文件用户名进行大小写转换
\u \l \U \L转换大小写,前边小写u和l仅变更开头字符,大写U和L变更全部

sed 's/^[a-z-_]\+/\u&/' /etc/passwd 将用户名首字母转大写

sed 's/^[a-z-_]\+/\u&/' /etc/passwd将用户名第一个单词转大写

sed 's/^[a-z-_]\+/\l&/' /etc/passwd 将用户名首字母转小写

sed 's/^[a-z-_]\+/\L&/' /etc/passwd 将用户名第一个单词转小写

例3:将文件夹下的所有文件名,进行大小写转换

[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# ls | sed 's/^\w\+/\U&/'
A.txt
B.txt
C.txt
D.txt

4、( )号对匹配到的内容进行分组
例子1:将password文件中的用户名提取出来

[root@iZ2ze1yhgn9t43ir5x8qr8Z ~]# sed 's/^\(\w\+\):.*$/\1/' passwd
root
phpwww

例子2:获取password文件中的用户名、uid、和gid

[root@iZ2ze1yhgn9t43ir5x8qr8Z ~]# sed 's/^\(\w\+\):x:\([0-9]\+\):\([0-9]\+\).*$/USER:\1 UID:\2 GID\3/' passwd 
USER:root UID:0 GID0
USER:bin UID:1 GID1

5、( )符号,替换某种(或某部分字符串)

[root@iZ2ze1yhgn9t43ir5x8qr8Z ~]# ifconfig  | sed -n '2p' | sed 's/^\([a-z ]\+:\)\([0-9\.]\+\)\(.*\)$/\2/'
172.17.167.8

6、-r:复制指定文件插入到匹配行;
-w:复制匹配行已重写文件的方式,写入到目标文件里,即目标文件的内容,将被替换成你匹配到的内容
  源文件————————————-》目标文件
  源文件《 ————————————目标文件

例子:
初始化文件 a.txt 和 1.txt

[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# cat a.txt 
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccc
[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# cat 1.txt 
11111111111111111111111111
222222222222222222222
333333333333333

例子1:sed ‘2r 1.txt’ a.txt #将1.txt文件的所有内容,保持原格式,插入到a.txt文件的第2行,结果如下(实际上并没有对a.txt文件修改)

[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# sed '2r 1.txt' a.txt 
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
11111111111111111111111111
222222222222222222222
333333333333333
ccccccccccccccccccccc

例子1:sed ‘2w 1.txt’ a.txt #将a.txt文件的第2行,写入1.txt文件,可以理解为,是拿a.txt文件的第2行内容,替换1.txt文件的全部内容,
结果如下(实际上并没有对a.txt文件修改,但是1.txt文件已经被修改了)

[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# sed '2w 1.txt' a.txt 
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccc
[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# cat 1.txt 
bbbbbbbbbbbbbbbbbbb
[root@iZ2ze1yhgn9t43ir5x8qr8Z test]# cat a.txt 
aaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccc

7、-q 退出sed命令
例子1. nl /etc/passwd | sed '10q' /etc/passwd

#代表只显示password文件前十行然后就提前结束

例子2. 
  nl /etc/passwd | sed '/nologin/q' /etc/passwd
# 代表匹配到password文件中的第一个nologin字符串,就退出sed

总结

sed总结

下一篇就是,linux三剑客之awk之妙,创作中。。。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值