文本三剑客之一 —— sed
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本三剑客之一 —— sed相关的知识,希望对你有一定的参考价值。
前言:这一次我们主要来介绍一下文本三剑客之一的sed,并且介绍一下各种用法
一,介绍
sed (Stream EDitor)
是一种流编辑器,一次处理一行内容,所以我们也称之为行编辑器。
在学习sed之前我们要先了解俩个内容
模式空间
在用sed对文本进行处理的时候,将正在处理的行储存在一个临时缓冲区中,这个缓冲区我们称为模式空间
保持空间
对于在模式空间正在处理的行还有其他处理时,暂时储存在另一个临时缓冲区,这个缓冲区称为保持空间
功能
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
二,用法
sed 选项 '地址定界 编辑命令 编辑内容'
支持正则表达
常用选项
地址命令
编辑命令
查找替换
s/// (支持使用其他分隔符,例如[email protected]@@)
综合举例详解
进入/app下拷/etc/passwd文件的一半内容,并在其中加几行空行,内容如下
看例子
如图所示标记先看第一个示例,sed 一般用单引号,'2p'表示在默认输出的后面输出第二行,文件其他内容都显示出来是因为sed是对行处理,没有要求自然直接输出,而你要输出第二行,所以第二行输出了俩次;想要输出你要输出的那行,那么就用到了 -n ,也就是第二个示例;第三个示例则是打印了模式空间所匹配到的空行的行号,看一下之前文件的内容,是不是结果显示的那几行呢
接下来看一下三个用法相同的选项
a后面接上文本是在指定行后加文本,2指定地行,所以第二行后面有了root,a后面\这个只是起到分隔作用,可加可不加
i 是在指定行前面加文本,其他跟a 一样用法
c 则是替换指定行,所以可以看到原本的第二行没有了,root成为了第二行
看一下匹配字符串的行用这三个命令是应该怎么敲
匹配字符串的是/pattern/,所以是/root/表示的是可以匹配到root的行,a,i,c,都是一样的
好,看一下其他选项的示例
首先,模式空间匹配到的是空行,d是删除模式空间匹配的内容,所以最后输出的结果就是没有空行
这个也是删除,1,10是地址界定匹配第1行到第10行,然后删除
nl是打印除了空行的行的行号,然后删除第二行到第五行
这个则是打印非空行的行号之后,在第二行后面增加tea,a 后面的空格则是跟之前提到的\一样 是分隔符
替换,g是全文替换,前面是被替换的内容,后面是替换的内容,所以是将全文的test换成mytest,至于example,是文件名啊
这里出现的&,代表的是root,跟后向引用用法相似,但不是后向引用,&代表前面所匹配的字符串
这个示例讲的则是-e -e ,多项编辑,并且的关系,把文件中的dog换成cat,并且把hi换成lo,没加地址定界和g,就只换每一行第一个匹配到的字符串;加了地址定界就是替换定界的行,加了g就是全文替换
-i.bak,在修改了文件内容,并且备份到一个以.bak结尾的文件,也就是原来的文件是修改的了,后缀是.bak的则是原文件
三,高级用法
先来看一下模式空间和保持空间的关系
接下来看一下具体的示例
分析一下,n是读取匹配到行的下一行覆盖到模式空间,也就是模式空匹配第一行,然后再读取第二行覆盖到模式空间,,所以就只剩第二行了,-n只输出模式空间的内容;以此类推,所以最后就是输出第二行第四行,也就是输出偶数行,选项之间用;间隔,验证一下
结果确实是输出偶数行,自己敲一下就可以验证,后面的示例就不一一验证了
!是进行反处理,1!就是不是第一行,G将保持空间的内容追加到模式空间,h将模式空间的内容覆盖到保持空间,$!不是最后一行,删除;整条命令的进行过程就是这样的,读取第一行,是第一行不进行处理,然后模式空间是第一行,覆盖到保持空间,不是最后一行,删除;读取第二行,先将保持空间内容追加到模式空间,保持空间是第一行,所以追加到模式空间的第二行后面,然后模式空间内容覆盖到保持空间,所以现在模式空间和是第二行第一行,然后不是最后一行,所以模式空间的内容删除,一次类推,最后输出的就是倒序内容
N是读取匹配的行的下一行追加到模式空间,D是删除直到$的内容,一直到最后一行,没有下一行,直接输出,最后输出的结果就是输出最后一行
这个就是对不是最后一行的内容进行N处理,然后除了最后一行都删除,匹配第一行时,追加第二行到模式空间,然后删除第一行,剩下第二行;再读第二行,模式空间是第二行第三行,删除第一次进行处理留下的第二行,剩下第二行第三行,一次类推结果就是剩下最后两行
这俩个放在一起说,g是覆盖,G是追加,从保持空间到模式空间,刚开始的时候没有其他处理保持空间没有内容,所以就是追加或者覆盖空白行,所以最后结果就是G是每一行下面都多了一个空行,g则是都是空行
之前有过一个例子sed -n 'n;p'是输出偶数行,这次没有-n 'p' ,然后又把模式空间匹配到的偶数行都删除了,所以就剩下奇数行输出了
总结:sed我知道的就这些了,最后再来梳理记忆一下
以上是关于文本三剑客之一 —— sed的主要内容,如果未能解决你的问题,请参考以下文章