###介绍
Sed(stream editor),是个非常方便的流处理器,其执行流程如下: 拷贝输入流中第一行的内容到模式空间(pattern space),如果地址约束(address restriction)成立,那么对模式空间的内容执行第一个sed命令,然后接着执行下一条sed命令,当最后的操作执行完之后,输出模式空间的内容,读入下一行内容。
###地址约束(address restriction) 就是对输入的行进行一个条件测试,如果满足就执行接下来的sed命令,否则不执行,主要有以下类型:
###语法格式
单条命令
sed 'address command' < in > out
多命令
sed -e 'address command' -e 'address2 command2' < in > out
如果命令太多,可以把命令放在一个文件script-file中
sed -f script-file < in > out
###常用命令
###1. s(substitute)这个命令是我们用的最多的,用来进行文本替换
把old.txt中的”foo”全部(g的作用)替换成”bar”
sed 's/foo/bar/g' old.txt > new.txt
只替换第二个”foo”为”bar”
sed 's/foo/bar/2' old.txt > new.txt
&代表匹配的字符内容,以下会把“foo”替换成“(foo)”
echo foo | sed 's/[a-z]+/(&)/'
可以用1,2…9来引用正则表达式的子模式,以下的输出是“bar foo”
echo foo bar | sed 's/([a-z]*) ([a-z]*)/2 1/'
默认情况下sed会把替换之后的内容完全输出,以下命令可以让sed只输出被修改过的内容
sed -n 's/foo/(&)/p' new.txt
这只会对第5行至第8行进行处理,其中“5,8”为一个区间,与“s/foo/(foo)/”之间有一个空格
sed '5,8 s/foo/(foo)/'
以下会对101行以后(包括101)的内容做替换,“$”代表最后一行
sed '101,$ s/foo/bar/'
以下会对文本中含有”start”行的内容进行替换
sed '/start/ s/foo/bar/'
如果一个表达式以反斜杠开始,那么接下来的字符就是分隔符。以下使用”,”来作为分隔符
sed ',^#, s/[0-9][0-9]*//'
你可以指定两个正则表达式作为一个区间。以下会删除“start” “stop”两个关键词之间的注释
sed '/start/,/stop/ s/#.*//'
你可以把行号和正则表达式合并在一起。以下将会从文件第一行开始到匹配到“start”为止,把这个范围内的注释删掉
sed -e '1,/start/ s/#.*//'
###2. d(delete)这个命令用来删除必要的行
以下把11行之后的内容删掉
sed '11,$ d'
以下为删除所有空白和tab
sed -e 's/#.*//' -e 's/[ ^I]*$//' -e '/^$/ d'
###3. p(print) 这个命令用来控制sed的输出
打印前10行
sed -n '1,10 p'
打印匹配的内容,和’grep match’一样的效果
sed -n '/match/ p'
不打印匹配的内容,和’grep -v match’一样的效果
sed -n '/match/ !p'
###4. q(quit)命令用来在适当的时候让sed退出
在第11行退出
sed '11 q'
q命令不能用在区间中,以下是错的,因为你不可能让sed退出10次
sed '1,10 q'
###5. w(write)这个命令用来把处理过的内容写入指定的文件
把”in”中的偶数写入文件”even”
sed -n 's/^[0-9]*[02468]/&/w even' < in
###6. r(read)这个命令用来读入指定文件的内容
以下在包含INCLUDE的行后面插入”file”文件的内容
sed '/INCLUDE/ r file' < in
###7. a(add), c(chang),i(insert)
在WORD后面插入一行
sed '
/WORD/ a
Add this line after every line with WORD
'
在WORD前面插入一行
sed '
/WORD/ i
Add this line before evey line before WORD
'
替换WORD所在行的内容
sed '
/WORD/ c
Replace the current line with the line
'
以上三个命令都可以插入多行
sed '
/WORD/ a
Add this line
This line
And this line
'
###8. = 命令用来输出行号
输出行号 sed -n ‘/foo/ =’ test.txt
输出最大行号
sed -n '$=' test.txt
###9. y这个命令用来做转换用
把单词从小写装换成大写
sed 'y/abcdef/ABCDEF/' file
###分组 你可以用「{」和「}」来把命令分组,如下
#!/bin/sh
# This is a Bourne shell script that removes #-type comments
# between 'begin' and 'end' words.
sed -n '
/begin/,/end/ {
s/#.*//
s/[ ^I]*$//
/^$/ d
p
}
'
参考:
http://www.grymoire.com/Unix/Sed.html
(完)