shell工具之sed

sed

sed是一种流式编辑器。处理时,先将要处理的行存储在临时缓存区,称为“模式空间”,然后sed命令处理模式空间的数据,处理完成后,将缓存区的内容输出到屏幕上,接着处理下一行,直到处理到文件尾。

在处理数据时,匹配成功,执行相应的命令或者将结果打印到标准输出上;匹配失败,丢弃忽略或者输出到标准输出上。

和模式空间相对应的一个空间叫做“保持空间”,主要用来临时存放数据,处理数据只能在模式空间中处理。sed默认的正则是基础正则匹配。

sed的命令格式

* sed '正则表达式/命令' 文件名
* sed '正则表达式' -f scriptfile 文件名

常见的基本使用

/pattern/p:打印匹配pattern的行

这里写图片描述
从结果可以看出,sed是一行一行处理的,正则匹配成功将该行打印,匹配失败,也会将该行打印,加上-n选项就会只打出匹配成功的行。

/pattern/d:删除匹配pattern的行

注意:sed是不影响源文件的,但是加上-i选项源文件也会跟着改变。
这里写图片描述

/pattern/s/pattern1/pattern2/

查找符合pattern的行,将该行的第一个匹配pattern1的字符串替换为pattern2

给带有printf的行添加注释。
这里写图片描述

/pattern/s/pattern1/pattern2/g

查找符合pattern的行,将该行的所有匹配pattern1的字符串替换为pattern2
这里写图片描述
通过结果可以看出,不带g只匹配第一个满足条件的,带g匹配所有满足条件的。
这里写图片描述
&代表与被替换的内容保持一致。

子串匹配标记\1, \2,…,\n

将数字789替换成978.

这里写图片描述
这个例子中没有正则,匹配的是全部。

(..)用于匹配子串,\1表示第一个子串,\n表示第n个子串。通过对数字进行重组,从而完成数据的逆置。

定址

确定一个范围,地址的形式包括数字、正则表达式、数字+正则表达式,若没有指定地址,sed处理额输入文件的所有行。

用数字来确定地址,按行处理。

这里写图片描述

用正则表达式确定地址,处理。

这里写图片描述

用数字+正则处理。

这里写图片描述

sed的退出码

匹配成功或者失败退出码都是0.grep成功是0,失败时1.
这里写图片描述

模式空间与保持空间

在前面介绍sed时候就提到了模式空间,模式空间可以进行数据处理,但保持空间只能暂时存储数据。

sed高级命令

命令 解释
g 将保持空间的数据拷贝到模式空间,原来的模式空间的数据清除
G 将保持空间的数据追加在模式空间
h 将模式空间的数据拷贝到保持空间
H 将模式空间的数据追加到保持空间
d 删除模式空间中的所有行,并读入下一新行到模式空间中
D 删除多线模式中的第一行,不读入下一行
x 交换保持空间和模式空间的内容
n 读取下一行到模式空间
N 将下一行追加在模式空间中

给每一行后添加一个空行

原理:保持空间起初是什么都没有的,将保持空间的数据追加在模式空间,sed是按行处理的,就会在每一行后添加一个空行。
这里写图片描述

用sed实现tac的功能

原理:保持空间的第一行(为空行)不追加在模式空间,其他均追加在模式空间中,然后再将模式空间的内容拷贝到保持空间,除了最后一行。
这里写图片描述

追加匹配的行到文件的结尾

原理:用正则表达式匹配的行,然后将其追加在保持空间,在模式空间的最后一行后,将保持空间的数据追加在模式空间。
-e选项是允许爱同一行执行多条命令。
这里写图片描述

进行行列转换

原理:将模式空间的数据追加在保持空间,先将模式空间的数据与保持空间的的数据进行交换,在模式空间中将\n替换为空格,然后输出。
这里写图片描述
注意:不能进行直接替换,因为保持空间只负责暂时存储数据,不对数据进行处理。

打印奇数行、偶数行

原理:n是读取下一行,如果先打印,就是奇数行。先读取下一行,然后进行打印是偶数行。
这里写图片描述

求1~100的求和

方法一:

原理:利用seq 100,产生从1到100的整数,先将数据放入保持空间,然后将保持空间的数据和模式空间的数据进行交换,然后将所有\n替换为+,最后打印出来,用bc进行处理。
这里写图片描述

方法二:

原理:利用seq 100,产生从1到100的整数,定义一个标签a,N是将下一行追加在模式空间中,然后将\n替换为+,!ba表示最后一行不用跳转到a标签,结束本次操作。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/80963331
今日推荐