2016年7月27日星期三

Linux_110:常用命令之三十六:sed

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

1. 语法:sed [-nefr] [n1[,n2]] function 
(1)-n :安静模式。默认情况下,所有来自标准输入的数据都会列出到终端上。加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
(2)-e :直接在命令列模式上进行 sed 的动作编辑。
(3)-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
(4)-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
(5)-i :直接修改读取的文件内容,而不是输出到终端。
(6)[n1[,n2]] function :n1,n2 行数起止;function,要进行的动作。
其中,function 可以设定的动作有:
(1)a :新增,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
(2)c :取代,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
(3)d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
(4)i :插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
(5)p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
(6)s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

2. 例子
(1)nl /etc/passwd | sed '2,5d'
显示所有的数据,但是把 2-5 行数据删除。注意, sed 后面接的动作,要用单引号引起来。
(2)nl /etc/passwd | sed '2d'
显示所有的数据,但是只删除第 2 行。
(3)nl /etc/passwd | sed '3,$d'
显示所有的数据,但是第 3 行到最后一行。
(4)nl /etc/passwd | sed '2a drink tea'
在第 2 行后的下一行加上 drink tea。
(5)nl /etc/passwd | sed '2i drink tea'
在第 2 行前的上一行加上 drink tea。
(6)nl /etc/passwd | sed '2a drink tea or \
> drink beer ?
在第 2 行后面加入两行文字,drink tea or  与 drink beer ?
添加的每一行之间都必须要以反斜杠  \ 来添加新行。
(7)nl /etc/passwd | sed '2,5c No 2-5 number'
把第 2~5 行的内容取代成为 No 2-5 number。
(8)nl /etc/passwd | sed -n '5,7p'
 只列出 /etc/passwd 文件的第 5~7 行。

3. 搜索和替换例子
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。
搜索和替换语法格式:sed 's/要被取代的字串/新的字串/g'
(1)nl /etc/passwd | sed '/root/p'
输出含有 root 的匹配行和所有行。
(2)nl /etc/passwd | sed -n '/root/p'
只输出含有 root 的匹配行。
(3)nl /etc/passwd | sed  '/root/d'
删除所有包含 root 的行,输出其它行。
(4)nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p}'
搜索所有包含 root 的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 bash 替换为 blueshell,再输出这行。
(5)nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}'
搜索所有包含 root 的行,只替换第 1 个 bash 关键字为 blueshell,就退出。
(6)/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
删除 IP 前面的部分。
其中 ifconfig eth0 输出如下:inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
(7)/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
删除 IP 后面的部分。
(8)nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
 -e 表示多点编辑,第一条命令删除第 3 行到末尾的数据,第二条命令搜索 bash 并替换为 blueshell。

参考文献:
1. http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html