sed工具

版权声明:本文为博主原创文章,允许转载,转载请注明出处。 https://blog.csdn.net/LF_2016/article/details/70455439

一、什么是sed
sed叫做流编辑器,在shell脚本和Makefile中作为过滤一使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换成为另一种格式输出。sed是一种在线编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为”模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
这里写图片描述

二、sed命令
命令格式:
sed [选项] ‘[动作]’ 文件名
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。

动作:
a:追加,在当前行后添加一行或多行。
c:行替换,用c后面的字符串替换原数据行。
i:插入,在当前行前插入一行或多行。
p:打印,输出指定的行。
s:字符串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字符串/新字符串/g”(如果不加g的话,则表示只替换每行第一个匹配的串)。

三、定址
定址取决于对那些行进行编辑。地址的格式可以是数字、正则表达式,或二者结合,如果没有指定地址,则sed将处理文件的所有行。
1、数字定址
例1:输出第2到4行
这里写图片描述

例2:将第二行全部替换成hello wrold.
这里写图片描述

2、正则表达式”/pattern/action”。
例1:将以字母开头的行中的数字2替换成two。
这里写图片描述

例2:删除出现字母的行
这里写图片描述

四、模式空间与保持空间
保持空间:用来存储数据,相当于一个仓库,它不能对数据进行处理。
模式空间:专门以行为单位对数据进行处理。
一般情况下,如果不显示的使用一些选项的话,是不会用到保持空间的。

命令:
g:将保持空间的内容拷贝到模式空间中,会将模式空间原来的值覆盖掉。
G:将保持空间的内容追加到模式空间中。
h:将模式空间的值拷贝到保持空间,会将保持空间原来的值覆盖掉。
H:将模式空间的值追加到保持空间中。
d:删除模式空间的所有行,并读下一行到模式空间。
D:删除模式空间的第一行,不读下一行到模式空间。
n:输出模式空间的行,读取下一行替换当前模式空间的行,接着执行下一条处理命令而不是第一条命令。
N:读入下一行,追加到模式空间行后面,此时模式空间中有两行。
x:交换模式空间和保持空间的内容。

例1:给每一行结尾添加一行空行
这里写图片描述
解释:当sed处理文件的时候,每一次都读取一行到模式空间,然后再’G’也就是从保持空间再读一行追加到模式空间,但是保持空间什么都没有啊,所以就读一个空行到模式空间,然后再将模式空间的值打印出来打印出来。

例2:用sed模拟实现tac(倒序打印)功能
这里写图片描述
解释:如果不是第一行,就把保持空间的行全部都追加到模式空间中。然后再将模式空间中的行全部都保存到保持空间中,覆盖掉保持空间原来的内容。如果不是最后一行的话,在删除模式空间中的所有内容,并读取一行到模式空间中。
这里写图片描述

例3:追加匹配行到文件结尾。
这里写图片描述
解释:如果用正则匹配到了某一行,则就将这一行追加到保持空间里面。如果是最后一行,则就将保持空间的内容追加到模式空间中。

例4:将一列内容转化成一行内容
这里写图片描述
解释:因为模式空间是按行进行处理的,如果模式空间只有一行内容,则就会去掉换行符。如果模式空间有多行内容的话,则就会加上换行符。首先将所有行都保存到保持空间。如果是最后一行的话,则x将保持空间和模式空间的值进行交换。然后将模式空间中的所有换行符用空格替换。
为什么上面用了两条命令输出的结果有些细微的差别,这是因为H的时候,保持空间中有空行,直接追加的话会追加到空行的后面。

例5、求1到100的求和
这里写图片描述
解释:与例4基本相同,通过seq生成1到100的序列,然后将所有行存到保持空间,最后一行时将保持空间和模式空间进行交换,然后用”+”替换所有的换行符。最后会生成如上表达式,再经过bc进行计算。

例6:打印偶数行
这里写图片描述
解释:sed每次都会自动读取一行,然后直接执行n命令再读取一行到模式空间覆盖掉原来的行。这时候再执行p命令。所以每次打印的就是偶数行。

例7:打印奇数行
这里写图片描述

五、使用标签
定义标签: “:标签名”
跳到标签: “b标签名”

例:使用标签求1到100的求和
这里写图片描述
解释:”:a”就表示一个a标签,ba就表示跳转到a标签。每读一行,都使用b跳转到标签处继续向后执行,就类似于一个循环,直到最后一行才跳出循环。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试