专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
InfoQ架构头条  ·  DeepSeek爆降AI成本,但算力资源可能 ... ·  3 天前  
51好读  ›  专栏  ›  马哥Linux运维

一篇文章学会shell工具篇之sed

马哥Linux运维  · 公众号  · 运维  · 2017-06-27 08:08

正文

  • sed工具执行原理;

  • 有关sed的参数及action的常见操作方法;

  • 定址;

  • 模式空间和保持空间;

  • 使用标签

1.首先先来了解一下什么是sed?

sed叫做流编辑器,在shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换成为另一种格式输出。下面我们通过一张原理图来了解一下它的工作模式:

编辑命令的格式为,sed   /pattern/action

经过sed处理后文件内容并没有改变,除⾮使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;sed默认按照Basic 规范基本匹配!也就是说类似于( ) { } | 等特殊字符需转义,否则就不识别,或者是用扩展模式也可以。

2. 下面重点介绍一下有关sed的参数及action的操作方法

(1)-n参数,p命令的action

(2) d命令的action


(3)/pattern/ s /pattern1/pattern2/:查找符合pattern的行,将 该行第一个 匹配pattern1的字符串替换为pattern2
/pattern/ s /pattern1/pattern2/ g :查找符合pattern的行,将 该行所有 匹配pattern1的字符串替换为pattern2

这个操作不知道大家会不会联想到vim编辑器中的底行模式搜索,它们是类似的。


下面总结一下sed中参数的选择及执行操作:

[plain] view plain copy

  1. 参数选择:

  2. -n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则只会把经过sed命令处理的行输出到屏幕。

  3. -e:允许对输入数据应用多条sed命令编辑。

  4. -i:将修改结果直接写入到读取数据的文件,而不是由屏幕输出。(1.修改了文件; 2.由cat可查看)

  5. -f: 指定sed脚本的文件名。

  6. action:

  7. a:追加,在当前行后添加一行或多行。

  8. c:行替换,用c后面的字符串替换原数据行。

  9. i:插入,在当前行前插入一行或多行。

  10. p:打印,输出指定的行。

  11. s:字符串替换,用一个字符串替换另外一个字符串。格式为”行范围s/旧字符串/新字符串/g”(如果不加g的话,则表示只替换每行第一个匹配的串)。


以上没有练习到的,有兴趣的可以去尝试尝试!


3.再来介绍一下sed中的定址

定址用于决定对文件中哪些行进行行编辑,地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。下面举一些例子:

sed '/start/ ,/end/d' file   #删除包含’start’行和’end’行之间的行
sed '/start/, 10d' file       #删除包含’start’ 的行到第十行的内容


4.模式空间和保持空间

(1)保持空间:用来存储数据,相当于一个仓库,它不能对数据进行处理 ;
(2)模式空间:专门以行为单位对数据进行处理。

一般情况下,如果不显示的使用一些选项的话,是不会用到保持空间的。

[plain] view plain copy

  1. 命令:

  2. g:将保持空间的内容拷贝到模式空间中,会将模式空间原来的值覆盖掉。

  3. G:将保持空间的内容追加到模式空间中。

  4. h:将模式空间的值拷贝到保持空间,会将保持空间原来的值覆盖掉。

  5. H:将模式空间的值追加到保持空间中。

  6. d:删除模式空间的所有行,并读下一行到模式空间。

  7. D:删除模式空间的第一行,不读下一行到模式空间。

  8. n:输出模式空间的行,读取下一行替换当前模式空间的行,接着执行下一条处理命令而不是第一条命令。

  9. N:读入下一行,追加到模式空间行后面,此时模式空间中有两行。

  10. x:交换模式空间和保持空间的内容。


例1:给每行后面添加一行空行

例2:用sed模拟倒序(tac)打印的过程



例3.追加匹配行到文件末尾


例4:将一列内容变为一行

例5:求出1-100的求和

例6:打印输出奇数行和偶数行

5.使用标签

[plain] view plain copy

  1. :a表示标签a;

  2. ba表示跳转到a标签;

  3. $表示最后一行;

  4. !表示不做后续操作







请到「今天看啥」查看全文


推荐文章
爱奇艺晓松奇谈  ·  日本那些满怀工匠精神的手艺人们
8 年前
InsDaily  ·  你家也许根本不需要客厅!
8 年前
财经早餐  ·  【财经早餐】2017.3.30星期四
7 年前
新材料在线  ·  2017 光学薄膜领域20大重磅事件
7 年前