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标签,结束本次操作。