sed:Stream Editor,行编辑器
默认基本工作模式:
一次从文本中读取一行,读取出来后放再sed自己所用到的内部缓冲区中(patter space:模式空间),在模式空间完成编辑后将编辑后的内容打印至屏幕上
在没指地址定界时每一行都匹配。
用法:
sed [OPTION]... 'script' [inputfile]...
常用选项:
-n:静默模式,不输出模式中的内容只屏幕
-e:多点编辑:
-f:/PATH/TO/SCRIPT_FILE:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:原处编辑
地址定界:
(1)不给地址,对全文进行处理
(2)单地址:
#:指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3)地址范围:
#,#
#,+#
/pat1,/pat2/
#,/pat1/
编辑命令:
d:删除
p:显示模式空间中的内容
a \text:在行后面追加文本,支持使用\n实现多行追加
i \text:在行前面插入文本,支持\n多行插入
c \text:替换行为单行或者多行文本
w /path/from/somefile:保存模式空间匹配到的行只指定文件中
r /path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后
=:为模式空间中的行打印行号
!:取反条件
s///:查找替换,支持使用其他分隔符,s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:将替换成功的结果保存至指定文件中
高级编辑命令:
hold space(保持空间):作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间。
h:把模式空间中的内容覆盖至保持空间中
H: 追加
g:把保持空间中的内容覆盖至模式空间中
G: 追加
x:模式空间的内容与保持空间内容互换
n:读取匹配到的行的下一行至模式空间(覆盖)
N:追加
d:删除模式空间的行
D:删除多行模式空间中的所有行
举个栗子:
*1)删除第1行至第4行 *
2)显示以UUID开头的行
错误做法:
可以看到不使用-n时会把整个文件显示出来,而且被匹配到的内容显示了两次,因为默认会把模式空间所有内容都显示,而p命令又把匹配到的行显示了一次,所以就有两次显示
正确做法:使用-n指定静默模式
3)在匹配到的行后面追加 hello sed
这些追加上去的hello sed单独成行,我们可以使用-n进行测试
多行追加:
还可以使用\t
4)把文本添加到匹配到的行的前面
5)将匹配到的行替换
6)将以#开头的行的定向到fstab.txt文件中
7)显示以0结尾的行号
8)将/etc/issue的内容显示到匹配行的下面
9)删掉不以UUID开头的行(!是对匹配到的内容取非)
10)将r开头,中间任意两个字符,t结尾的字符串,替换成ROOT
默认只替换每行匹配到的第一个字符串
使用-g可以进行全局替换
11)将r开头,中间任意两个字符,t结尾的字符串,后面加er
&表示引用前面匹配到的字符串
12)在替换时将替换的行显示出来
练一练:
删除/boot/grub/grub.conf文件中的所有以空白开头的行行首的空白字符
[root@foundation44 tmp]# sed 's/^ \+//' grub.cfg
[root@foundation44 tmp]# sed 's/^[[:space:]]\+//' grub.cfg
删除/etc/fstab中左右以#开头的后面至少跟一个空白字符的行行首的#和后面的空白字符
[root@foundation44 tmp]# sed 's/^#[[:space:]]\+//' fstab
[root@foundation44 tmp]# sed -i 's/^# \+//' fstab
输出一个绝对路径给sed命令,取出其基名
[root@foundation44 tmp]# echo "/tmp/fstab/xixi/hahah/" | sed 's#[^/]\+/\?$##'
关于patter space 和 hold space的使用
我们现在有一个haha的文件,内容如下
1)显示文件偶数行
[root@foundation44 tmp]# sed -n 'n;p' haha
分析:
由于没有指定界定符,所以从第一行开始读取
1被匹配到,2读入模式空间
由于第二行已经在模式空间,所以从第三行开始匹配,3被匹配到,4读入模式空间
5被匹配到,6读入模式空间
p显示出来模式空间的内容,所以为2,4,6
2)逆向显示文件中的内容
[root@foundation44 tmp]# sed '1!G;h;$!d' haha