描述:
sed是Stream EDitor(行编辑器)的简写,是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件, 简化对文件的反复操作, 编写转换程序等。
用法:
sed [option]… ‘script' inputfile…
常用选项:
-n :不输出模式空间内容的自动打印
示例:仅列出/etc/passwd 文件内的第5-7行
[root@localhost ~]# nl /etc/passwd |sed -n '5,7p' 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-e: 多点编辑
示例:处理/etc/fstab 或/etc/fstab/,使用sed命令取出其基名
[root@localhost ~]# echo "/etc/fstab" |sed -r -e 's@/$@@' -e 's@/.*/@@' fstab [root@localhost ~]# echo "/etc/fstab/" |sed -r -e 's@/$@@' -e 's@/.*/@@' fstab
-f / PATH/TO/SCRIPT_FILE : 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
示例:处理/etc/fstab 路径,使用sed命令取出其目录名
[root@localhost ~]# echo "/etc/fstab/" |sed -r 's@[^/]+/?$@@' /etc/
-i: 原处编辑 (危险操作,不建议使用)
script:地址命令
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/ :被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~ :步进
1~2 奇数行
2~2 偶数行
编辑命令:
d: 删除模式空间匹配的行
示例:将/etc/passwd 的内容列出并打印行号,同时删除第2-5行
[root@localhost ~]# nl /etc/passwd |sed '2,5d' 1root:x:0:0:root:/root:/bin/bash 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
p: 显示模式空间中的内容
示例:将第2行打印到屏幕上
[root@localhost ~]# nl /etc/passwd |sed '2p' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
a \text :在行后面追加文本;支持使用\n 实现多行追加
示例:在第2行后加上“drink tea”字样
[root@localhost ~]# nl /etc/passwd |sed '2a drink tea' 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3daemon:x:2:2:daemon:/sbin:/sbin/nologin
i \text :在行前面插入文本;支持使用\n 实现多行插入
示例:在第2行前加上“drink tea”字样
[root@localhost ~]# nl /etc/passwd |sed '2i drink tea' 1root:x:0:0:root:/root:/bin/bash drink tea 2bin:x:1:1:bin:/bin:/sbin/nologin
c \text :替换行为单行或多行文本
示例:将第2-5行的内容替换成为“NO 2-5 number”
[root@localhost ~]# nl /etc/passwd |sed '2,5c NO 2-5 number' 1root:x:0:0:root:/root:/bin/bash NO 2-5 number 6sync:x:5:0:sync:/sbin:/bin/sync
w /path/to/somefile: 保存模式匹配的行至指定文件
示例:将第5-7行保存到/root/f1文件中
[root@localhost ~]# nl /etc/passwd |sed '5,7w/root/f1' [root@localhost ~]# cat f1 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
r /path/from/somefile :读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
[root@localhost ~]# sed -n '/^$/=' /etc/issue 显示空白行的行号 3
!: 模式空间中匹配到的行取反处理
[root@localhost ~]# sed -n '/^$/!=' /etc/issue 除空白行以外的行显示行号 1 2
s/// : 查找替换, 支持使用其它分隔符,s@@@ ,s###
示例:删除/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
[root@localhost ~]# sed 's@^[[:space:]]\+@@g' /etc/grub2.cfg # # DO NOT EDIT THIS FILE if [ -s $prefix/grubenv ]; then load_env fi
v: 替换标记:
g: 行内全局替换
p: 显示替换成功的行
[root@localhost ~]# sed -e's@^#@@p' /etc/fstab 显示替换成功的行 /etc/fstab /etc/fstab Created by anaconda on Sun Aug 7 06:26:08 2016 Created by anaconda on Sun Aug 7 06:26
w: /PATH/TO/SOMEFILE :将替换成功的行保存至文件中
[root@localhost ~]# sed 's@^#@@w/root/f3' /etc/fstab 将替换成功的行保存至/root/f3文件中
[root@localhost ~]# cat f3 /etc/fstab Created by anaconda on Sun Aug 7 06:26:08 2016 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
高级编辑命令:
h: 把模式空间中的内容覆盖至保持空间中
H: 把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G: 从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N: 追加匹配到的行的下一行至模式空间
d: 删除模式空间中的行
D: 删除 当前模式空间开端至\n 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
事先准备好的文件:
[root@localhost ~]# cat f1 1 2 3 4 5 6 7 8 9 10
1,sed -n 'n;p' FILE
[root@localhost ~]# sed -n 'n;p' f1 显示偶数行 2 4 6 8 10
2,sed '1!G;h;$!d' FILE
[root@localhost ~]# sed '1!G;h;$!d' f1 逆序显示 10 9 8 7 6 5 4 3 2 1
3,sed '$!N;$!D" f1
[root@localhost ~]# sed '$!N;$!D' f1 只显示最后两行 9 10
4,sed '$!d' FILE
[root@localhost ~]# sed '$!d' f1 只显示最后一行 10
5,sed ‘G’ FILE
[root@localhost ~]# sed 'G' f1 在每一行的后面添加一个空白行 1 2 3 4 5 6 7 8 9 10
6,sed ‘g’ FILE
[root@localhost ~]# sed 'g' f1 显示10个空白行
7,sed ‘/^$/d;G’ FILE
[root@localhost ~]# sed '/^$/d;G' f1 显示的效果和第5题一样,但不同之处是: 1 先将文件内的所有空白行删除,然后在每一行的后面添加一个空白行 2 3
8,sed 'n;d' FILE
[root@localhost ~]# sed 'n;d' f1 显示基数行 1 3 5 7 9
9,sed -n '1!G;h;$p' FILE
[root@localhost ~]# sed -n '1!G;h;$P' f1 显示最后一行 10
总结:
1,sed工具作为文本处理三剑客中的一员,体现了其强大的功能,在处理多文件和写脚本中的应用是很个广泛的,需多加练习,才能灵活掌握其用法
2,以行为单位的新增/删除功能,替换/显示功能,‘s/要被替换的字符串/新的字符串/g'功能是经常用到的,需记忆并多加练习才能熟练掌握
原创文章,作者:pingsky,如若转载,请注明出处:http://www.178linux.com/32121