sed,Stream EDitor 流编辑器,废话不多说,你懂得.
工作机制:
从文件中分别取出每一行至模式空间(pattern)进行编辑处理,并输出至屏幕.
命令格式:
sed [option] ‘script’ file_name
option:
-n,--quient,--silent ,静默模式,不输出模式空间中的内容.
-i,--in-place ,源文件编辑.
-e ,多点编辑,支持多个编辑命令.
sed -e ‘s/UUID/uuid/’ -e ‘s/#//’ fstab
-f file_name ,指定一个编辑命令文件,与at的-f类似.
-r,--regexp-extended ,支持扩展正则表达式,默认为基本正则表达式.
Script的组成为:”地址定界编辑命令”
地址定界:
1) 单个地址: # 数字,表示指定的单行进行编辑
/pattern/ 表示对被此模式匹配到的行进行编辑
2) 地址范围: #,# 数字,表示对从#到第#行结束的行进行编辑
#,+# 数字,表示对从第#行开始,到+#行结束的行进行
/pattern1/,/pattern2/ 表示对被第一个/pattern1/匹配的行开始到第一个被/pattern2/匹配的行结束的行进行编辑
编辑命令:
d ,表示删除符合条件的行
p ,表示打印符合条件的行
a \text 表示在符合条件的行后追加text文本信息,支持多行 \n
I \text 表示在符合条件的行后插入text文本信息,支持多行 \n
C \text 表示把符合条件的行更改为text,注意:更改的整行,区别s
w /some/to/file_name 把符合条件的行写入到指定文件中
r /some/to/file_name 把文件写入到符合条件的行前。
sed ‘1r /etc/issue’ /etc/fstab #将issue文件写入到fstab之前
= 显示模式空间中的行号
! 对地址空间进行取反
s/// 查找替换,支持s@@@, s###
替换标记:
g 表示替换
& 表示后向应用整体
sed ‘s/r..t/&er/’ /etc/passwd #查找字符”r..t”并在尾部加er
练习:
1) 删除/etc/grub.conf文件中所有以空白字符开头的行的行首空白字符。
sed ‘s/^[[:space:]]\+//’ /etc/grub.conf
2) 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
Sed ‘s/^#[[:space:]]\+//’ /etc/fstab
3) Echo一个绝对路径,取基名与目录名。
目录名: echo “/etc/sysconfig/123” | sed ‘s/[^/]\+$//’
基名: echo “/etc/sysconfig/123” | sed ‘s@^/.*/@@’
高级命令:
h hold,将模式空间中的内容覆盖至保持空间
H 将模式空间中的内容追加至保持空间
g get,将保持空间中的内容覆盖至模式空间
G 将保持空间中的内容追加至模式空间
x 将模式空间与保持空间中的内容交换
n 将符合条件的行的下一行覆盖至模式空间
N 将符合条件的行的下一行覆盖至模式空间,此时模式空间存在多行
d 删除模式空间中的单行
D 删除模式空间中的多行
p 打印符合条件的行
典型应用:
Sed -n ‘n;p’ file #显示偶数行
Sed ‘n;d’ file #显示奇数行
Sed ‘1!G;h;$!D’ file #将文件倒序输出,类似于tac
Sed ‘$!N;$!D’ file #显示文件的倒数两行
Sed ‘G’ file #在每行之后插入空白行
Sed ‘/^$/d;G’ file #将多行空白替换为一行