文本处理工具sed的高级用法

在上一章,我们学习了sed的一些基本用法,利用这些基本用法我们已经可以解决文本处理中遇到的绝大部分问题,但要想更加利用好sed这个工具,我们还需要学习下它的一些高级用法。

本节索引

一、模式空间与保持空间

二、sed高级用法

三、示例分析

 

在上一章,我们学习了sed的一些基本用法,利用这些基本用法我们已经可以解决文本处理中遇到的绝大部

分问题,但要想更加利用好sed这个工具,我们还需要学习下它的一些高级用法。

c945a2f105a803f14cfb695cca60bf2f

 

一、模式空间与保持空间:

我们知道sed工作机制是每次读取一行文本至模式空间(pattern space)中,在模式空间中完成处理,将

处理结果输出至标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可

能还有其他的处理,因此可以把处理过的行传送至一个叫保持空间(hold space)中,然后在后续的处理中

再次传送回模式空间中。这就类似加工车间和仓库的概念,好比模式空间是加工车间,保持空间就是仓

库,不过这里的仓库存储的都是些半成品的产品。

二、sed高级用法:

Sed工具支持一些高级的命令来运用到保持空间中,这些高级命令有:

P:打印模式空间开端至\n内容,并追加到默认输出之前 

h: 把模式空间中的内容覆盖至保持空间中 

H:把模式空间中的内容追加至保持空间中 

g: 从保持空间取出数据覆盖至模式空间 

G:从保持空间取出内容追加至模式空间 

x: 把模式空间中的内容与保持空间中的内容进行互换 

n: 读取匹配到的行的下一行覆盖至模式空间 

N:读取匹配到的行的下一行追加至模式空间 

d: 删除模式空间中的行 

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,

并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间

不包含换行符,则会像发出d命令那样启动正常的新循环。

三、示例分析:

以下我们均以该文档为例:

文档

例1:cat test2.sed |sed ‘G’

解析:由于保持空间初始默认为空,所有将空行追加到每行的模式空间中输出,等同在每行的

后面添加一个空行。

例6

例2:cat test2.sed |sed ‘g’

解析:g和G的区别在,g为覆盖模式空间,G为追加至模式空间,由于g默认为空,将每行的模式空间都覆

盖为空行输出,所以表现为5个空行。

例7

例3:cat test2.sed |sed ‘$!d’

解析:$表示尾行,$!d则表示除了尾行都执行删除。

例5

例4:cat test2.sed |sed ‘n;d’

解析:n将第一行读入模式空间输出,并将下一行即第二行覆盖至模式空间并删除,如此循环,最终表现为

只显示文本的奇数行。

例9

例5:cat test2.sed |sed ‘N;D’

解析:N将第二行追加至第一行的模式空间中,D删除模式空间内的第一行;对第二行执行命令,将第三行追加至第二行的模式空间内,并删除模式中的第一行;如此循环,最后只输出最后一行文本。

例3

例6:cat test2.sed |sed ‘$!N;$!D’

解析:’$!N;$!D’即对文本中除了最后一行支持’N;D’操作,由例外5可知,除了最后一行执行’N;D’操作,得出

结果为只输出倒数第二行,最后一行文本不处理,默认输出,所有最后结果输出倒数两行的文本。

例4

例7:cat test2.sed|sed -n ‘n;p’

解析:对第一行执行操作,n选项将第二行覆盖至模式空间,在第一行和第二行的默认输出后追加打印出来,-n取消默认输出,如此循环,最后得出文本的偶数行。

例1

例8:cat test2.sed|sed -n ‘1!n;p’

解析:与例7相比,例8为对除了第一行的其他行执行例7的操作,则最后的结果也为得出文本的奇数行。

奇数行

例9:cat test2.sed |sed ‘/^$/d;G’

解析:^$为表示地址定界匹配到的空行,d将空行删除,G在每行的文本后添加一个空行;最后的输出结果即:删除文本内的空行,并在每行后追加一行空行。

例8

例10:cat test2.sed |sed ‘1!G;h;$!d’

解析:1!G表示除了第一行,都执行将保持空间的内容追加至模式空间并输出,h命令使上一个模式空间内容将G覆盖,最后$!d只保留对最后一行的执行结果,具体表现为:

对第1行只进入模式空间默认输出,第2行将上一个模式空间内容(即第1行文本)覆盖至保持空间,共同进入模式空间(包含第2至1行文本)并输出;第3行将上一个模式空间内容(即第2至1行文本)覆盖至保持空间,共同进入模式空间(包含第3至1行文本)并输出;如此循环…….对第5行将上一个模式空间内容(第4至1行)覆盖至保持空间,共同进入模式空间(包含5至1行)输出;最后$!d除了最后一行的其他行的模式空间内容都删除,最后只留最后一行的执行结果,即将文本倒序输出。

例2

例11:cat test2.sed |sed -n ‘1!G;h;$p’

解析:与例10相比,最后的$p只打印最后一行的模式空间内容(第5至1行),-n取消所有默认输出,得出的结果与例10相同,倒序将文本输出。

例10

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96587

(3)
wangxczwangxcz
上一篇 2018-04-19
下一篇 2018-04-20

相关推荐

  • 自建yum仓库,分别为网络源和本地源

    [base] name=CDRom baseurl=file:///mnt gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 [CentOS] name=CentOS.org baseurl=http://vault.centos.org/7.4.1708/os/x86_64/ enabled=1 gpg…

    Linux笔记 2018-06-07
  • N31-第二周作业—文件的管理

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    2、bash的工作特性之命令执行状态返回值和命令行展开所涉及的内容及其示例演示。
    3、请使用命令行展开功能来完成以下练习:
    (1)、创建/tmp目录下的:a_c, a_d, b_c, b_d
    (2)、创建/tmp/mylinux目录下的:
    mylinux/
    ├── bin
    ├── boot
    │   └── grub
    ├── dev
    ├── etc
    │   ├── rc.d
    │   │   └── init.d
    │   └── sysconfig
    │   └── network-scripts
    ├── lib
    │   └── modules
    ├── lib64
    ├── proc
    ├── sbin
    ├── sys
    ├── tmp
    ├── usr
    │   └── local
    │   ├── bin
    │   └── sbin
    └── var
    ├── lock
    ├── log
    └── run
    4、文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。
    5、如何定义一个命令的别名,如何在命令中引用另一个命令的执行结果?
    6、显示/var目录下所有以l开头,以一个小写字母结尾,且中间至少出现一位数字(可以有其它字符)的文件或目录。
    7、显示/etc目录下,以任意一个数字开头,且以非数字结尾的文件或目录。
    8、显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录。
    9、在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10、复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    11、复制/etc目录下所有以.d结尾的文件或目录至/tmp/mytest2目录中。
    12、复制/etc/目录下所有以l或m或n开头,以.conf结尾的文件至/tmp/mytest3目录中。

    2018-07-05
  • 第二周总结

    反向单引号 ` `:执行能力强,可以执行命令 [等价于$()]单引号 ‘ ’:只显示字符双引号 “ ”:识别变量,不识别命令花括号{ }: 里面内容互相组合 打印重复字符串的简化形式echo file{1,3,5} 结果为:file1 file3 file5rm -f file{1,3,5} 删除file1 file3 file5echo file{1..1…

    Linux笔记 2018-07-29
  • 網絡屬性配置2

    網絡屬性配置2 一.ip命令 [root@centos7 ~]# rpm -qf /usr/sbin/ip 或[root@centos7 ~]# rpm -qf `which ip` iproute-3.10.0-87.el7.x86_64 (查看某個文件是由哪個程序包安裝生成) ip – show / manipulate routing, d…

    Linux笔记 2018-05-03
  • 虚拟机系统

    系统安装

    2018-04-01
  • 课堂实验

    实验:实现Gelera cluster 三台主机1 yum安装[mariadb]name = MariaDBbaseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/gpgcheck=0 httpd2.2 order deny,allow a…

    2018-06-24