sed是一个流编辑器,通过多种类型转换来修改流经它的的文本。sed不会改变提供给它的源文件,而是把改变后的结果发送到stdout.
sed中每次处理一行。
sed的元字符有
.*[]^${}/+?|()
元字符用法:
除^外,其他符号在[]内如果要匹配自己本身字符要加/,否则是元字符的意义。^在[]内开头表示否定,在[]内的其他地方表示本身字符。
^ 还可用于匹配一行的开头;$用于匹配一行的结尾。
/^The/ 匹配以“The”开头的行
/end.$/ 匹配以“end.”结尾的行
/^T.*/.$/ 匹配以“T”开头以“.”结尾的行
/dog/匹配所有出现的“dog”
/t.m/匹配所有先出现t,然后隔一个字符再出现m的字符,如tim,tom等。
/(<expresion>
/(<expresion>
/) 括号的分组用法
/{1,4/} 限制次数的用法
* 前面的字符0个或多个
/+ 前面的字符1个或多个
& 在替换域中使用表示整个匹配部分,如s/hat/"&"/,&表示前面两个/之间部分
[[:alpha:]]匹配任意字母字符,大写或小写
[[:alnum:]]匹配任意字母数字字符,相当于[0-9A-Za-z]
[[:blank:]]匹配空格或制表字符
[[:digit:]]匹配数字,相当于[0-9]
[[:lower:]]相当于[a-z]
[[:upper:]]相当于[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符,包括空格、制表符、NL、FF、VT、CR
sed一些常用选项:
-n 抑制自动输出(用命令p,P输出)
-i 直接修改文件内容
sed的执行流程:
a)开始时,把第一行读入模式空间。
b)把命令逐一应用到模式空间,如果没有其他控制干预,则所有命令执行完后就会到达脚本尾部,这时输出模式空间的内容,然后清除模式空间。
c)读入下一行(永远记住当前行是模式空间中行号最大的那行,特别是用到N命令和控制流程改变时往往很容易搞错下一行是什么),重复b)过程。
上面说的“其他控制干预”包括标号的跳转,D命令。D命令删除模式空间中的第一个/n之前(包括这个/n)的所有内容,保留第一个/n之后的内容,然后返回脚本开始处。(有些死循环导致不能到达脚本最后,死循环中又没有用p,P命令,这时有内容输出是由于一些命令有立刻输出模式空间的功能(如n输出模式空间的内容然后读入下一行而不用返回脚本顶端)。最好还是不要依赖sed的自动输出了,自己显式p吧)。
典型的sed命令行选项:
替换(s)
替换指令格式如下:sed [address1[,address2]] s/pattern/replacement/[n|g] filename
标志g表示对文本全部行进行操作;标志n表示将要替换第n次 出现的表达式。
sed 's/this/that/' file.txt 把输入文件中每一行第一次出现的this替换为that. 与下句效果等同:
sed 's/this/that/1' file.txt
如果要把第二次出现的this替换为that,把n设置为2即可。
sed 's/is/IS/g' file.txt 整个文件中出现的每个is都被IS取代
5s/this/that/ 把第五行的this 替换为that,仅对第五行进行这个操作。
1,5s/this/that/ 1,5表示从第一行到第五行,把第一行到第五行的this 替换为that,仅对第五行进行这个操作。
5,$s/this/that/ $ 把最后五行的this 替换为that
5,$!s/this/that/ !不要对给出的行进行操作, 即不要对最后五行的this 替换为that
也可以指定样式的范围,而不仅是行数的范围,如:
sed '/^The/s/this/that/' 把所有以The开头的行进行替换。
sed '/start/,/end/s/index/idx/g' 对从包含start的行到包含end的行之间所有行进行替换操作。
删除(d)
sed '1,5d' file.txt 删除文件的前5行
应用!来反转约束条件:
sed '1,5!d' file.txt 删除前5行之外的所有行
打印(p)
打印可视为删除的逆操作。但有一个不同,必须指明-n标志,以免向输出端重复打印。
sed -n '1,5p' file.txt 打印前5行
sed -n '/^:/p' file.txt 打印以冒号开头的行
行的添加(a)、插入(i)、改变(c) //注意,改变的是整个新行
sed '/start/a/ ' file.txt 在包含start的行后插入一个空白行。
sed '$i/ ' file.txt 在文件的末尾插入一个空白行。
sed '/secret/c/DELETED' file.txt 查找单词secret,然后把包含它的整行替换为DELETED。
可以使用{}把多个指令编成一个指令组加以执行。
下面这段脚本 在匹配到关键字的行之前插入一个start行,之后播放一个sed行,然后把这一行本身替换成DELETED。
sed '/secret/{
i/
--start
a/
--end
c/
DELETED
}' file.txt
退出(q)
退出即结束sed编辑阶段。
sed '10q' file.txt p 这个命令发送文件的前10行,完成第10行后,就结束sed编辑阶段。
这个命令可以完成GNU/Linux 中head命令的功能。
轮换(y)
y指令可以转换文本,可以把一个字符转换为另一个。要提供两个字符集合,第一个是查找集合,第二个是替换集合。
例如下面示例,如果遇到A,就把它替换为a,以此类推。这个示例把所有大写字母转换成小写字母。
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt
进行转换时,样式和替换字符按照一一对应的关系进行处理,因些,这两个字符串的长度必须相等。
行数(=)
=用于发送当前的行数。可用于发送匹配给定的查找字符串的行数,或是发送输入文件的行数。
例如,如果想知道哪些行包含了指定的查找样式 ,可用以下脚本:
sed -n '/This/=' file.txt 这个脚本 会发送包含单词This的那些行的行数,即每行的行号。
保持样式 空间(h)
在sed中,有很多空间(缓冲器),sed命令就在其中进行操作。每一输入行都首先复制到样式空间。样式空间是由sed临时拥有的空间,供sed命令执行。在对样式 空间完成脚本所指定的工作后,这一行就会被 复制输出。
在sed中还有保留空间,可以把样式 空间中的内容 复制到保留空间,然后在晚些时候取回他们。保留空间只是一个临时缓冲器,但在要记录某些行进可能非常有用。
使用保留缓冲器,可以把样式空间中的内容存储到保留缓冲器中,然后直接对样式缓冲器进行操作。下面这个示例演示了发送改变后的和未改变的行。
#表示对sed脚本 的注释,#后的字符都会识别为注释。
sed '{
#store the pattern space to the hold buffer
h
#perform the substitution on the pattern space
s/is/IS/
# append the unaltered line to the pattern sapce
G
}' file.txt
这个脚本发送改变后的行,然后立即发送未改动的行。
一些有用的sed单行程序:
#Emit the first 10 lines of a file(such as 'head')
sed 10q file.txt
#Emit a double-spaced version of the file
sed 'G' file.txt
#Emit number of lines in input file
sed -n '$=' file.txt
#Emit the last line of a file
sed '$!d' file.txt
#Emit all lines greater than 30 characters in length
sed -n '/^./{30/}/p' file.txt
#Emit all non-blank lines
sed '/^$/d' file.txt
#Remove all blank lines at the top of a file
sed '/./,$!d' file.txt
http://blog.163.com/william_djj@126/blog/static/351665012009855101645/