sed被称为linux文本处理的三剑客之一。
sed的工作机制是对文本按照模式的规定进行逐行的进行操作,但是默认情况下sed不会修改原文件(可以添加参数来修改原文件),因为sed在处理文本的时候会创建自己的模式空间,因此,在对文本处理之前会逐行的将文本内容读入到其模式空间当中,然后在模式空间中再根据匹配条件对这一行的内容做相应的操作。另外,sed同时还提供另外一个空间模式(我们暂称为保持空间),保持空间用来读取模式空间中的内容,然后在根据命令对其做相应的操作。其实保持空间就是sed为了处理模式空间中的文本而提供的一个数据中转站。
下面就是sed的常用命令:
sed: sed [OPTION]... ‘sed脚本’ [input-file]..
常用选项:
-n:静默模式,不输出模式空间的内容到屏幕
-e:多点编辑,可实现对多个文件同时处理
-f:/path/from/script_file:从指定文件中读取编辑脚本(脚本中只需要写脚本命令,不需要写sed)
例: [root@localhost tmp]# cat ss
s/aaa/hello/g
-r:支持使用扩展正则表达式(sed默认支持基本正则表达式):
-i :直接修改原文件
地址定界:
1、不给地址,对全文中的每一行进行处理
2、单地址,
#,表示指定特定的行
/patter/ :被次模式所能匹配的每一行
3、地址范围:
#,# 指明第几行到第几行
#,+n 指明第几行及其后面几行
/patter1/,/patter/ 指明从patter1匹配到的行开始到patter2匹配到的行结束
#,/patter1/ 指明从第几行开始到第一次被模式匹配到的行之间的所有行
4、~:表示步进
例:1~2 表示显示奇数行
2~2 表示显示偶数行
常用编辑命令;
d :删除
p :显示模式空间中被模式匹配到的行
a \text :append,后面追加文本,支持\n追加行添加
i \text :insert,前面插入文本,支持\n插入多行
c \text :change,替换行伪单行或多行文本
w /path/to/filename :将匹配到的行保存到某个指定文件中
r /path/from/filename :读取指定文件的文本流至匹配到的行的行尾
= :为模式空间的行打印行号
!:取反条件,例:sed “/^UUID/!d" /etc/fstab
s///g:支持使用其他分割符, s@@@,s###,
g行内表示全局替换
p:显示替换成功的行
w /path/to/somefile :将替换成功后的结果保存至文件中
高级编辑命令:(用在模式空间和保持空间中的数据交换的命令)
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行至模式空间
N:追加匹配到的行的下一行至模式孔家
d:删除模式空间中的行
D:删除多行模式空间中的所有行
例:
sed 's/r..t/&er/' file : &表示替换前面模式匹配到的所有内容
例:[root@localhost ~]# sed 's/^[[:space:]]*//' /boot/grub/grub.conf
sed -n 'n;p' file :显示偶数行
sed '1!G;h;$!d' file :逆向显示文件内容
sed '$!N;$!D' file 取出文件后两行
sed '$!d' 取出文件最后一行
sed 'G' file:
sed '/^$/d;G' file 将多个空白行合并为一个空白行
sed 'n;d' file :显示奇数行
sed -n '1!G;h;$p' file :逆向显示文件中的每一行
取路径名
sed -r 's@(/.*/)[^/]+/?@\1@'
sed -r 's@(/.*)+[^/]/?(.*)@\1@'
sed 's@[^/]\+/\?$@@'
取路径基名
sed -r 's@(/.*/)([^/]+/?)@\2@'
sed -r 's@(/.*)+([^/]/?)@\2@'