sed 可以分析标准输入(STDIN)的数据,然后将数据经过处理后,再将它输出到标准输出(STDOUT)。它有替换、删除、新增、选取特定行等处理功能。
# sed [-nefr] [动作]
参数:
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会显示在屏幕上。但如果加上 -n 参数,则只有经过 sed 特殊处理的那一行才会列出来。
-e :直接在命令行模式上进行 sed 的操作编辑。
-f :直接将 sed 的操作写在一个文件内,-f filename 则可以执行 filename 内的 sed 操作。
-r :sed 的操作支持的是扩展的正则表达式语法(默认是基础正则表达式语法)。
操作说明:[n1[,n2]]function
n1, n2: 不一定存在,一般代表“选择进行操作的行数”,举例来说,如果操作需要在10到20行之间进行,则“10,20[操作行为]”。
function 有下面这些操作:
a :新增,a 的后面可以接字符串,而这些字符串会在新的一行出现(当前的下一行)。
c :替换,c 的后面可以接字符串,这些字符串可以替换 n1,n2 之间的行。
d :删除,因为是删除,所以 d 后面通常不接任何内容。
i :插入,i 的后面可以接字符串,而这些字符串会在新的一行出现(当前的上一行)。
p :打印,即打印某个选择的数据。通常 p 会与参数 sed -n 一起运行。
s :搜索,不但可以搜索,还能进行替换。通常 s 操作可以与正则表达式一起使用。例如 1,20s/old/new/g。
注意:
sed 后面接的操作务必以单引号('')括住。
范例:
范例一:显示 /etc/passwd 的内容,并且需要打印行号,同时,将第2~5行删除。
[root@linux ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin/:/sbin/shutdown
....(后面省略)....
# 因为 2~5 行删除了,所以显示的数据中就没有 2~5 行。
#另外,注意一下,原本应该是要执行 sed -e 才对,没有 -e 也行。
#同时要注意,sed 后面接的操作,请务必以('')两个单引号括住。
# 如果只要删除第2行,可以使用 nl /etc/passwd | sed '2d' 来实现。
#第3行到最后一行,则是 nl /etc/passwd | sed '3,$d'
范例二:接上题,在第二行后(即是加上第三行)加上“drink tea?”字样。
[root@linux ~] # nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
# 在 a 后面加上的字符串已出现在第二行后面。如果要在第二行前呢?
# nl /etc/passwd | sed '2i drink tea'即可。
范例三:在第二行的后面加入两行字,例如“Drink tea or ....” "drink bear?"
[root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ....\
>drink bear ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ....
drink bear ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#这个范例的重点是,我们可以新增不只一行。就是说,可以新增好几行,
#但每行之间必须要以反斜线 \ 来进行新行的增加。
范例四:将第2~5行的内容替换为“No 2-5 number”。
[root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 lines'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
范例五:仅显示 5~7行。
[root@linux ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
# 为什么要加 -n 参数?执行 sed '5,7p'就知道了。
范例六:可以使用 ifconfig 列出 IP,若仅要 eth0 的IP地址呢?
[root@linux ~]# ifconfig eth0 | grep 'inet' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
阅读(619) | 评论(0) | 转发(0) |