一、基础概念

sed是一个文本流编辑器,全称为Stream EDitor。
sed命令拥有两个加工空间,分别为模式空间和保持空间,类似工厂加工零件的一车间、二车间。

模式空间

sed命令处理文件时将文本流依次读进自己的模式空间完成加工处理,处理完毕后将模式空间信息输出至屏幕

保持空间

保持空间的信息不进行任何输出,其可以配合模式空间完成一些高级操作。比如文本逆序、添加空行等等。普通编辑用不到保持空间,仅模式空间即可

二、命令用法

命令格式:sed [OPTION]... ‘script’ input-file...

OPTION:
-n:静默模式,不把模式空间的内容输出至屏幕
-e:多点编辑功能
-f /path/to/script:从指定文件读取编辑脚本,文件中写入引号内的内容
-r:扩展正则表达式
-i[.bak]:在原处编辑
script:脚本片段由地址定界和编辑命令组成,定界和编辑命令中间没空格

地址定界:
:不给地址,表示对全文进行处理
#:指定第#行
/pattern/:被模式匹配到的每一行
#,#:从第#行到第#行
#,+#:从第#行到+#行
/pat1/,/pat2/:两个模式匹配到之间的行
#,/pat1/:从第#行到第一次被模式匹配到的行
1~2:指定步长,表示所有奇数行。2~2,表示所有偶数行

编辑命令:
d:删除符合条件的行
p:显示模式空间中符合条件的内容
a \text:在匹配到的下一行追加文本,可使用\n进行换行
i \text:在匹配到的上一行追加文本,可使用\n进行换行
c \text:替换符合条件的行
w /filename/:把符合条件的内容另存到文件中
r /filename/:把指定文件中的内容读取到匹配到内容的行后,需结合地址定界使用
=:为匹配到的行打印行号
!:取反条件
s///[giw]:查找替换,支持使用其他分隔符, g为全局替换,i为不区分大小写,w表示将结果保存至指定文件

高级编辑命令:
h:把模式空间的内容覆盖至保持空间中
H:把模式空间的内容追加至保持空间中
g:get,从保持空间覆盖到模式空间中
G:从保持空间追加至模式空间中
x:把模式空间与保持空间中的内容互换
n:读取匹配到行的下一行至模式空间
N:读取匹配到的行下一行追加至模式空间
d:删除模式空间中的行
D:删除多行模式空间的所有行

三、 练习

  1. 删除/etc/group2.cfg文件中所有以空白开头的行行首的空白字符
    sed 's/^[[:space:]]\+//' /etc/grub2.cfg
  2. 删除/etc/fstab/文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
    sed 's/^#[[:space:]]\+//' /etc/fstab
  3. echo一个绝对路径给sed命令取出取基名,取出其路径名及目录名
    目录名:~]# echo /etc/sysconfig/network-scripts/ifcfg-ens33/ | sed -r 's@[^/]+/?$@@'
    路径名:~]# echo /etc/sysconfig/network-scripts/ifcfg-ens33/ | sed -r 's@/?$@@' | sed -r 's@/.*/@@'
  4. 显示偶数行
    ~]# sed -n 'n;p' /etc/fstab
  5. 逆序显示文件内容
    ~]# sed '1!G;h;$!d' /etc/fstab
  6. 取出文件最后一行
    sed '$!d' /etc/fstab
  7. 取出文件最后两行
    ~]# sed '$!N;$!D' /etc/fatab
  8. 删除原文件的所有空白行,之后在所有非空白行后面添加一个空白行
    ~]# sed '/^$/d;G' /etc/fatab
  9. 显示奇数行
    ~]# sed 'n;d' /etc/fstab
  10. 在原有的每行后面添加一个空白行
    ~]# sed 'G' /etc/fatab