文本处理三剑客(三)--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' 在原有的每行后方添加一个空白行
posted @ 2020-10-23 11:29  扬帆直上  阅读(93)  评论(0)    收藏  举报