Stream Editor 流编辑器 做行处理的

默认不直接编辑原文件,在内存中进行处理(但是会整篇处理),临时存放的空间叫做pattern space(模式空间)。如果可以被关键字匹配,然后就进行编辑(编辑完成后,可以将新的内容放入hold space,保持空间),如果没有被关键字匹配就默认输出到标准输出。

-n选项不输出模式空间中的内容至屏幕,默认情况下,不论模式空间的内容是否匹配关键字都会输出至屏幕。

-e script 默认只能一次处理一个脚本,-e 之后可以跟多个脚本,一个-e对应一个脚本,实现多点编辑。

-f /path/to/sed_script_file 每行一个编辑命令

-r 支持扩展正则表达式

-i 直接编辑原文件

地址定界

指定编辑范围

空地址表示对全文进行处理

单地址 # 指定行

           /pattern/ 被关键字匹配到的每一行

地址范围

#,# 指定行范围

#,+# 指定开始行,并往下#行

#,/pattern/ 指定行开始,到第一次匹配关键的行

/pattern1/,/pattern2/从第一次匹配关键字1开始,到第一次匹配关键字2的行

1~2 ~#表示步进,从第一行开始的奇数行

2~2 从第二行开始的偶数行


编辑命令 都是在操作  模式空间

d 删除指定范围内容

图片.png

图片.png

原文件没有改变

删除(不显示)包含UUID字符串的行

图片.png

注意:这两次d的位置 一次是在''里面,一次是在//外面

图片.png

可以在外面

现在看看-n的效果

图片.png

加了-n 什么都看不到了

显示奇数行

图片.png

删除偶数就是奇数

显示偶数行

图片.png

删除奇数就是偶数

p:显示模式空间中的内容

图片.png

为什么1和2出现了两次呢?因为,sed模式会将模式空间中的内容输出来,p的效果是将1和2输出,所以1和2输出了两次,为了不让模式空间的内容输出,只看p的效果,可以加个-n

图片.png

显示奇数行

图片.png


显示1到3行

图片.png

在指定位置增加内容

# \text

在第3行后增加指定内容

图片.png

添加后的效果,和-n的效果 如果追加的内容里有空格也不用管


在第三行增加多行内容

图片.png

注意:需要在单引号中写出需要追加的内容


在第三行追加内容,之前的第三行就变成第四行了。

图片.png

使用指定内容替换指定行

c \text

图片.png

数字3没了,被This is a test字符串替换了

w将指定范围内的内容另存为其他文档

图片.png

将非#号开头的行输出来

图片.png

这里可以看出,sed是支持正则表达式的,这个例子的难点就在于如何标识非#号


r将其他文件的内容追加到指定行

图片.png

在第四行之后追加内容。


为指定行打印行号

图片.png

先打印行号,在输出行的内容

! 条件取反

将非#号开头的行输出来

图片.png

第一个是非#号开头的行,第二个是#号开头的行,第二个命令我用了! 条件取反,而且注意这里的!需要转义,不然就解析为最近一次以p开头的命令并执行

图片.png


s 查找替换

这个类似于VIM编辑器的查找替换操作,分隔符可以执行指定 @ # 都可以,g表示全局替换(默认选项) w将替换后的内容另存为 ,p显示替换成功的行

删除文件中所有以空白字符开头的行的行首的所有空白符

图片.png

这个是原文

图片.png

这个是改过之后的,默认是全局又该

图片.png

这个就显示被修改过的行


把文件中的1改为a

图片.png

将指定行的1改为a

图片.png

图片.png

sed可以一次执行多次编辑操作

将/etc/fstab中的UUID改为uuid,再将uuid所在的行删除

图片.png

图片.png

输入一个绝对路径给sed命令,取出其目录,类似于dirname的命令

图片.png

发现没有t没有了

我现在加个尾部的定位符

图片.png

发现i字符没了,所以现在要取出dirname很简单啦

图片.png

输入一个绝对路径的sed,取出其文件名,类似于basename的命令

图片.png

这里要取代的是一个范围,需要用\1的方式

图片.png

高级编辑命令

h 将模式空间中的内容覆盖至保持空间中

H 将模式空间中的内容追加至保持空间中

g 将保持空间中的内容覆盖至模式空间中

G 将保持空间中的内容追加至模式空间中

x 将模式空间中的内容与保持空间中的内容互换

n 读取匹配到的行的下一行至模式空间中。

N 读取匹配到的行的下一行至模式空间中 追加

d 删除模式空间中的行

D 删除多行模式空间中的所有行

p显示模式空间中的内容

案例一 显示偶数行

图片.png

图片.png

由于没有指定操作范围,程序首先读入第一行,n的效果是让命令去读取本行的下一行,并将内容读入到模式空间,p的效果是将匹配的模式空间中的内容输出。


案例二 逆序显示文件内容

sed ‘1!G;h;$!d’ file_name

图片.png

从这个例子中,重新说明了几个问题,第一:sed 从文件中读取的内容首先放入模式空间中,通过匹配之后再放入保持空间中 第二:sed 读取内容是以行为单位的。第三 $符号的意思是读取内容的最后一行。 这个命令的过程类似于汉诺塔的游戏。


案例三 显示最后一行

sed '$!d' filename

图片.png


案例四 显示最后两行

sed '$!N;$!D' 显示最后两行

图片.png

当系统读入倒数第二行,由于倒数第二行不是倒数第一行那么就N,读取倒数第一行并追加。现在的模式空间中有2行,程序读取了倒数第一行那就不删除(!D),最后输出到屏幕


案例五

显示奇数行

sed 'n,d' filename

图片.png

图片.png