Linux 三剑客之 sed 命令

1、概述

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

 

2、命令格式

sed[OPTION]... {script-only-if-no-other-script} [input-file]...

或者可以理解为:sed  [options]  'AddressCommand'  file ...

 

0、全局数据

[oldboy@oldboy awktest]$ cat 01test 	
01
02
03
04
05
06
07
08
09
10

1、Address:匹配地址

1、number 只匹配指定的行
[oldboy@oldboy awktest]$ sed -n '4p' 01test 
04
2、first~step  从first开始,每次步长为step

       first可以为0

[oldboy@oldboy awktest]$ sed -n '2~3p' 01test   #从第二行开始,每次步长为3
02
05
08
2、StartLine,EndLine 开始行到结束行

       比如1,100     其中startLine最小为1不能为0

       $:最后一行

[oldboy@oldboy awktest]$ sed -n '4,6p' 01test  	# 4到6行
04
05
06
[oldboy@oldboy awktest]$ sed -n '4,$p' 01test  	# 4到最后一行  $表示最后一行
04
05
06
07
08
09
10
[oldboy@oldboy awktest]$ sed -n '0,$p' 01test  		# 不能从0开始
sed: -e expression #1, char 4: invalid usage of line address 0
3、/RegExp/或者\cregexpc 正则匹配

       注意:\cregexpcThe c may be any character

[root@oldboy ~]# sed -n '/root/p' /etc/passwd      
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@oldboy ~]# sed -n '/^root/p' /etc/passwd		# 匹配以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@oldboy ~]# sed -n '/sync$/p' /etc/passwd     	# 匹配以sync结尾的行
sync:x:5:0:sync:/sbin:/bin/sync

[root@oldboy ~]# sed -n '\@root@p' /etc/passwd  
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@oldboy ~]# sed -n '\@^root@p' /etc/passwd  
root:x:0:0:root:/root:/bin/bash
[root@oldboy ~]# sed -n '\@sync$@p' /etc/passwd  
sync:x:5:0:sync:/sbin:/bin/sync

       请认真区分上面两者的区别。

4、addr1,+N  从addr1开始,并且继续匹配下面的N行
[oldboy@oldboy awktest]$ sed -n '2,+3p' 01test 	
02
03
04
05

2、Command:命令操作

Zero- or One- address commands  建议只给一个地址信息,而不是地址范围
1、=  打印当前的行   sed-n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'
[oldboy@oldboy awktest]$ sed -n '7,$=' 01test     
7
8
9
10
[oldboy@oldboy awktest]$ sed -n '7,$ {=;p}' 01test  
7
07
8
08
9
09
10
10 
[oldboy@oldboy awktest]$ sed -n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'    
7: 07
8: 08
9: 09
10: 10

2、a \string    在指定的行后面追加新行,内容为string  【\n:可以用于换行
[oldboy@oldboy awktest]$ sed '6,8a \I love\nbingxing' 01test    # \n 可用于换行
01
02
03
04
05
06
I love
bingxing
07
I love
bingxing
08
I love
bingxing
09
10

3、i \string    在指定的行前面插入新行,内容为string  【\n:可以用于换行
[oldboy@oldboy awktest]$ sed '6,8i \I love\nbingxing' 01test  
01
02
03
04
05
I love
bingxing
06
I love
bingxing
07
I love
bingxing
08
09
10

4、q [exit-code] 和Q [exit-code]

       注意下面的区别:

[oldboy@oldboy awktest]$ sed '4q' 01test 	# 到第4行退出
01
02
03
04
[oldboy@oldboy awktest]$ sed '4,6q' 01test   # 只接受一个地址信息
sed: -e expression #1, char 4: command only uses one address
[oldboy@oldboy awktest]$ sed '4Q' 01test  	# 到第4行的前一行退出
01
02
03
[oldboy@oldboy awktest]$ sed '4,5Q' 01test 	# 只接受一个地址信息
sed: -e expression #1, char 4: command only uses one address 

5、r filename  从filename读取并追加文件
[oldboy@oldboy awktest]$ cat test 
zhanglaing
bingxing
[oldboy@oldboy awktest]$ sed '3,5r test' 01test  # 在匹配的地方追加信息
01
02
03
zhanglaing
bingxing
04
zhanglaing
bingxing
05
zhanglaing
bingxing
06
07
08
09
10

6、R filename  从filename追加文本信息,每次追加一行
[oldboy@oldboy awktest]$ cat test 
zhanglaing
bingxing
[oldboy@oldboy awktest]$ sed '3,5R test' 01test 	# 每n次匹配,追加test文件的第n行信息
01
02
03
zhanglaing		# 第一次,追加第一行
04
bingxing		# 第二次,追加第二行
05
06
07
08
09
10

Commands which accept address ranges  直接地址范围
1、c \string    替换匹配的行,内容为string  【\n:可以用于换行
[oldboy@oldboy awktest]$ sed '3,5c \zhang\nliang' 01test 	# 3到5行被替换
01
02
zhang
liang
06
07
08
09
10

2、d  删除模式空间内容,开始下次循环
[oldboy@oldboy awktest]$ sed '3,5d' 01test   # 3到5行被删除
01
02
06
07
08
09
10

3、l  列出当前行的所有信息                【小写的L】
[oldboy@oldboy awktest]$ sed -n '3,5l' 01test 
03$
04$
05$

4、l width  列出当前行的所有信息,宽度为 width 
[oldboy@oldboy awktest]$ sed -n '3,5l 2' 01test  
0\
3$
0\
4$
0\
5$

5、p  打印当前的模式空间
[oldboy@oldboy awktest]$ sed -n '2,5p' 01test 
02
03
04
05

6、s/regexp/replacement/  也可以为 s@@@   s###

默认只替换每行中第一次被模式匹配到的字符串  【前面是正则,后面是字符串

加修饰符

        g: 全局替换            s/pattern/string/g【修饰符】

        i: 忽略字符大小写      s/pattern/string/i【修饰符】

s///: s###, s@@@  效果一样    【\(\), \1, \2  分组】【&  引用模式匹配整个串, regexp部分

示例1
[oldboy@moban ~]$ cat /etc/fstab 
UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
[oldboy@moban ~]$ sed 's@/@##@' /etc/fstab 		# 只匹配匹配行第一次出现时,不是全局匹配
UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot                   ext4    defaults        1 2
tmpfs                   ##dev/shm                tmpfs   defaults        0 0
devpts                  ##dev/pts                devpts  gid=5,mode=620  0 0
[oldboy@moban ~]$ sed 's@/@##@g' /etc/fstab 
UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot                   ext4    defaults        1 2
tmpfs                   ##dev##shm                tmpfs   defaults        0 0
devpts                  ##dev##pts                devpts  gid=5,mode=620  0 0
[oldboy@moban ~]$ 
[oldboy@moban ~]$ sed 's@u@##@g' /etc/fstab  
UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defa##lts        1 2
tmpfs                   /dev/shm                tmpfs   defa##lts        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
[oldboy@moban ~]$ sed 's@u@##@gi' /etc/fstab  	# i 忽略大小写
####ID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defa##lts        1 2
tmpfs                   /dev/shm                tmpfs   defa##lts        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

示例2

l..e:  like-->liker

       love-->lover

                             

       like-->Like

       love-->Love

[oldboy@moban sed]$ cat sed2
hello, like
hi, my love
[oldboy@moban sed]$ sed 's/l..e/l..er/' sed2
hello, l..er
hi, my l..er
[oldboy@moban sed]$ sed 's/l..e/&r/' sed2      # 使用了 &
hello, liker
hi, my lover
[oldboy@moban sed]$ sed 's/\(l..e\)/\1r/' sed2    # 使用了向后引用 或者扩展正则: sed -r 's/(l..e)/\1r/' sed2
hello, liker
hi, my lover

7、w filename  将模式空间匹配的内容,写到filename  中
[oldboy@oldboy awktest]$ sed -n '3,6w test01' 01test 
[oldboy@oldboy awktest]$ cat test01
03
04
05
06

3、常用命令选项

       -n, --quiet, --silent  抑制模式空间的自动打印

[oldboy@oldboy awktest]$ sed '3,6p' 01test  
01
02
03
03
04
04
05
05
06
06
07
08
09
10
[oldboy@oldboy awktest]$ sed -n '3,6p' 01test 
03
04
05
06

    -e script,--expression=script   将脚本添加到要执行的命令。允许多点编辑

[oldboy@moban sed]$ cat sed1 
qwewq
wetwdgh
5555
zhang liang
werwet bbb
ewtew 123
ettte
[oldboy@moban sed]$ sed -e '1,3d' sed1 
zhang liang
werwet bbb
ewtew 123
ettte
[oldboy@moban sed]$ sed -e '1,3d' -e 's/zhang/bing/' sed1 # 第一个是删除1到3行,第二个是将'zhang'替换为'bing'
bing liang
werwet bbb
ewtew 123
ettte

    -f script-file, --file=script-file    添加脚本文件内容到将要执行的命令。示例如下


[oldboy@moban sed]$ cat script1    # 没有引号
1,3d 			# 删除1到3行
s/zhang/bing/	# 每行中把 zhang 替换为 bing
/liang/p		
[oldboy@moban sed]$ cat sed1 
qwewq
wetwdgh
5555
zhang liang
werwet bbb
ewtew 123
ettte
[oldboy@moban sed]$ sed -f ./script1 sed1 	
bing liang
bing liang
werwet bbb
ewtew 123
ettte
[oldboy@oldboy awktest]$ sed -n -f script1 sed1 	
bing liang

    -i[SUFFIX],--in-place[=SUFFIX]  直接修改读取的档案内容,而不是由屏幕输出。

[oldboy@oldboy awktest]$ cat sed2
zhang liang
werwet bbb
[oldboy@oldboy awktest]$ sed -i 's#bbb#bingxing#g' sed2
[oldboy@oldboy awktest]$ cat sed2
zhang liang
werwet bingxing

       --posix    禁用所有的GNU扩展。

       -r, --regexp-extended    在脚本中使用扩展正则表达式。

 

4、常用示例

       暂无

       请参见另一篇博文

 

5、命令所在位置和类型

[root@oldboy ~]# which sed
/bin/sed
[root@oldboy ~]# type sed
sed is /bin/sed

6、另请参见

1、Linuxsed 命令

2、三剑客之SED行天下



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值