sed流编辑器详解

sed流编辑器的工作原理

sed是一款流编辑器,它以行为单位对输入的文本进行编辑操作,将编辑结果标准输出至屏幕,而不修改原文件。

如下图所示,sed将文本以行为单位,传递至模式空间,然后根据已给出的script操作命令,对模式空间中的内容进行增、删、替换、打印等操作,然后将模式空间中的内容输出至标准输出。至此,结束了一行的编辑,再从文本中读取下一行,再进行上面的操作。

除了模式空间外,sed流编辑器还存在一个空间,叫保留空间。它和模式空间一样可以存储文本,可以和模式空间进行内容的传递、交换,从而达到很多奇特的功能,下面将有所解释。

图解sed流编辑器工作原理:
 图解sed流编辑器工作原理


以流程图的形式,描述sed流编辑器的工作过程:
这里写图片描述

地址定界

前面讲到,sed是以行为单位对文本进行编辑的,但有时候我们并不需要对文本中的所有内容进行编辑,这时候就需要使用到地址定界了

地址定界的三种情况:

1、空地址:对全文进行处理。

2、单地址:

  • #:指定行。

    [root@localhost ~]# cat -n fstab |sed -n '3p'
         3  # /etc/fstab
  • /parttern/:被此模式所匹配到的每一行,默认支持glob模式。

    [root@localhost ~]# cat -n fstab |sed -n '/filesystems/p'
         6  # Accessible filesystems, by reference, are maintained under '/dev/disk'
    

3、地址范围:

  • #1,#2:指定从第#1行到第#2行这个范围内的文本。

    [root@localhost ~]# cat -n fstab |sed -n '2,4p'
         2  #
         3  # /etc/fstab
         4  # Created by anaconda on Mon Mar  6 21:17:53 2017
    
  • #1,+#2:从第#1行开始,并向下延拓#2行,共#2+1行。

    [root@localhost ~]# cat -n fstab |sed -n '2,+2p'
         2  #
         3  # /etc/fstab
         4  # Created by anaconda on Mon Mar  6 21:17:53 2017
    
  • #,/part/:从第#行开始,到第一个被模式part匹配到的行结束。

    [root@localhost ~]# cat -n fstab |sed -n '9,/UUID/p'
         9  /dev/mapper/centos-root /                       xfs     defaults        0 0
        10  UUID=3b58e5e9-38a2-49f1-990b-3370489ff305 /boot                   xfs     defaults        0 0
    
  • /part1/,/part2/:从被模式part1匹配到的行开始,到被模式part2匹配到的行结束。
  • $:最后一行。

4、步进:~(波浪形前的数字表示起始行,波浪线后的数字表示步进长度)

  • 1~2:所有奇数行。
  • 2~2:所有偶数行。

    [root@localhost ~]# cat -n fstab |sed -n '1~2p'
         1  
         3  # /etc/fstab
         5  #
         7  # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         9  /dev/mapper/centos-root /                       xfs     defaults        0 0
        11  /dev/mapper/centos-home /home                   xfs     defaults        0 0
        13  /dev/sr0    /media/cdrom            iso9660 defaults    0 0
    


通过查看man手册,可以得到sed的使用命令格式:

SYNPPSIS: sed [OPTION]… {script-only-if-no-other-script} [input-file]…

接下来,我将分别介绍sed命令中的命令选项OPTIONS编辑命令/script,让大家了解如何使用sed编辑文本。

常用选项

首先,贴出常用的sed命令选项:

常用选项选项作用
-n不输出模式空间中的内容至屏幕
-e script,–expression=script多点编辑
-f script-file,–file=script-file使用脚本文件进行编辑操作
-r,–regexp-extended支持使用扩展正则表达式
-i[SUFFIX],–in-plaxe[=SUFFIX]直接编辑原文件

常用编辑命令

常用编辑命令一览表:

编辑命令命令作用
d删除
p显示
a \text在行后面追加文本“text”,支持使用\n实现多行追加
i \text在行前面插入文本“text”,支持使用\n实现多行追加
c \text把匹配到的行替换为此处指定的文本“text”
w /PATH/TO/SOMEFILE保留模式空间匹配到的行至指定的文件中
r/PATH/FORM/SOMEFILE读取指定文件的内容至当前文件被模式匹配到的行后面;文本合并
=为模式匹配到的行打印行号
!条件取反
s///查找替换,其分隔符可自行指定,常用的由s@@@,s###等

在模式空间和保持空间中进行各种传递交换内容的编辑命令:

编辑命令命令作用
h把模式空间中的内容覆盖至保持空间中
H把模式空间中的内容追加至保存空间中
g把保持空间中的内容覆盖至模式空间中
G把保持空间中的内容追加至模式空间中
x把模式空间中的内容与保持空间中的内容互换
n覆盖读取匹配到的行的下一行至模式空间中
N追加读取匹配到的行的下一行至模式空间中
d删除模式空间中的所有行
D删除多行模式空间中的所有行

部分编辑命令详解:

d:删除当前编辑的行

删除地址定界范围内的行:

[root@localhost ~]# cat -n fstab |sed '4,$d'
     1  
     2  #
     3  # /etc/fstab

p:显示模式空间中的内容

默认模式空间中的内容在编辑结束后会被打印,若再对匹配到的行进行“p”操作,则将被打印两次。如下:

[root@localhost ~]# cat -n fstab |sed '1,3p'
     1  
     1  
     2  #
     2  #
     3  # /etc/fstab
     3  # /etc/fstab
     4  # Created by anaconda on Mon Mar  6 21:17:53 2017
     5  #
     6  # Accessible filesystems, by reference, are maintained under '/dev/disk'
     ...省略更多...

所以,“p”编辑操作常与“-n”选项一同使用。(“-n”选项的作用是取消默认打印模式空间内容这一操作),如下:

[root@localhost ~]# cat -n fstab |sed -n '1,3p'
     1  
     2  #
     3  # /etc/fstab

a \text:在被匹配的行后追加文本“text”,支持使用\n实现多行追加

[root@localhost ~]# cat -n fstab |sed '2a \This is a new line\nThis is another new line'
     1  
     2  #
This is a new line
This is another new line
     3  # /etc/fstab

i \text:在行前面插入文本“text”,支持使用\n实现多行插入

[root@localhost ~]# cat -n fstab |sed '2i \This is a new line\nThis is another new line'
     1  
This is a new line
This is another new line
     2  #
     3  # /etc/fstab

c \text:把匹配到的行替换为此处指定的文本“text”,支持使用\n替换成多行

[root@localhost ~]# cat -n fstab |sed '3c  \This is a new line\nThis is another new line'
     1  
     2  #
This is a new line
This is another new line
     4  # Created by anaconda on Mon Mar  6 21:17:53 2017

w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中

r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面,可实现文件合并

=:为模式匹配到的行打印行号
行号位于该行前,且独占一行。

[root@localhost ~]# cat -n fstab |sed '='
1
     1  
2
     2  #
3
     3  # /etc/fstab
4
     4  # Created by anaconda on Mon Mar  6 21:17:53 2017
5
     5  #

!:条件取反

匹配到的行不执行打印操作,对未匹配到的行执行匹配操作。

[root@localhost ~]# cat -n fstab |sed -n '1,10!p'
    11  /dev/mapper/centos-home /home                   xfs     defaults        0 0
    12  /dev/mapper/centos-swap swap                    swap    defaults        0 0
    13  /dev/sr0    /media/cdrom            iso9660 defaults    0 0

s///:查找替换,与vim中末行模式相同,其分隔符可自行自定,常用的有s@@@,s###。其中,查找常用的修饰符有:

  • g:全局替换;
  • w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
  • p:显示替换成功的行;

示例:替换文本并打印:

[root@localhost ~]# cat -n fstab |sed -n 's@fstab@FSTAB@p' 
     3  # /etc/FSTAB
     7  # See man pages FSTAB(5), findfs(8), mount(8) and/or blkid(8) for more info
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值