sed流编辑器(行)
工作过程:sed命令一次只会读取文件的一行,并将取复制到pattern space中,如果匹配成功将进行编辑操作,并将结果标准输出;如果不能匹配将不做编辑操作,并将结果标准输出;
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
script:地址定界+编辑命令 提明对文本内容做相应的操作
常用选项:
-n:不输出模式空间中的内容至屏幕
-e script,--expression=script: 多点编辑
-f /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令
-r:支持扩展正则表达式
-i:直接编辑原文件
注:建议操作前先备份原文件
地址定界
1)不给(空)地址:对全方进行处理
2)单地址
#:指定行
/PATTERN/:被模式所匹配到的每一行;
3)地址范围
#;#|#,+#|#,/PATTERN/|/PATTERN1/,/PATTERN2/
4)步进:~
1~2所有奇数行
2~2所有偶数行
编辑命令
d:删除
[root@Centos-7-24 ~]# sed '1,5d' /etc/fstab --删除第1-5行
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0
sed '1~2d' /etc/fstab 删除奇数行
p:显示模式空间中的内容
[root@Centos-7-24 ~]# sed '3p' /etc/fstab
#
# /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Oct 2 14:55:18 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0
#
/new line
# Created by anaconda on Fri Oct 2 14:55:18 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0 w /PATH/TO/SOMEFILE:保存空间匹配到的行至指定的文件中 r /PATH/FROM/SOMEFILE:读取指定的文件内容至当前文件被模式匹配到的行后面,实现文件合并 [root@Centos-7-24 ~]# sed '3r /etc/issue' /etc/fstab
#
# /etc/fstab
\S
Kernel \r on an \m
# Created by anaconda on Fri Oct 2 14:55:18 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0 =:为模式空间匹配到的行打印行号 [root@Centos-7-24 ~]# sed '3,+2=' /etc/fstab
#
3
# /etc/fstab
4
# Created by anaconda on Fri Oct 2 14:55:18 2020
5
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0 !:条件取反 地址定界!编辑命令 [root@Centos-7-24 ~]# sed -n '/^#/!p' /etc/fstab
UUID=04e0f120-4359-4461-a325-7bf21f07079a / xfs defaults 0 0
UUID=fc40b667-afdf-4d5a-8904-107c11201406 /boot xfs defaults 0 0 s///:查找替换,其分隔符可自行指定,常用的有s@@@,s### 替换标记: g:全局替换 w:/PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中 p:显示替换成功的行 1.删除/boot/grub/grub2.cfg文件中所有空白字符开头的行的行首至所有空白字符; sed 's@^[[:space:]]\+@@' /etc/grub2.cfg 2.删除/etc/fstab文件中所有以#开头的行的行首#号及#后面的所有空白字符 sed 's@^#[[:space:]]*@@ ' /etc/fstab sed -e 's@^#[[:space:]]*@@ ' -e '/^UUID/d' /etc/fstab 多个条件编辑 3.输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname echo "/var/log/messages" | sed 's@[^/]\+/\?$@@' 高级编辑命令 h:把模式空间中的内容覆盖至保持空间中 H:把模式空间中的内容追加至保持空间中 g:把保持空间中的内容覆盖至模式空间中 G:把保持空间中的内容追加至模式空间中 x:把模式空间中的内容与保持空间中的内容互换 n:覆盖读取匹配到的行的下一行至模式空间中 N:追加读取匹配到的行的下一行至 d:删除模式空间中的行 D:删除多行模式空间中的所有行 例: sed -n 'n;p' file 显示偶数行 分号是用来分隔多个命令的 sed ‘1!G;h;$!d’ FILE:逆序显示文件的内容 sed '$!d' FILE:取出最后一行 sed '$!N;$!D' FILE 取出最后两行 sed '/^$/d;G' FILE 删除原有的所有空白行,而后为所有的非空白行后添加一个空白行 sed 'n;d'FILE 删除奇数行 sed 'G' 在原有的每行后方添加一个空白行