文本处理三剑客(三)--sed

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

a \test:在行后面追加文本"test",支持使用\n实现多行追加 i \test:在行前面插入文本"test",支持使用\n实现多行插入 [root@Centos-7-24 opt]# sed '3i \new line\nanother new line' /etc/fstab   # new line    ---追加文本 another new line  --支持使用\n多行追加 # /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 c \test :把匹配到的行替换为此处指定的文本"text" [root@Centos-7-24 ~]# sed '3c /new line' /etc/fstab

#
/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' 在原有的每行后方添加一个空白行
上一篇:linux系统重启之后直接进入到急救模式如何处理?


下一篇:Linux 硬盘挂载及开机挂载