简介
sed
是一个流编辑器,它会读取文件流,以行为单位进行处理。sed
会按照顺序执行对每一行执行命令。sed
把每一行结果写入标准输出,不修改任何输入文件。一般来说,文件流需要处理每一行的时候,需要借助sed
进行处理。
打印和删除
-e
参数表示执行一个命令脚本,而这个脚本都用' '
扩起来。脚本支持正则式,比如需要使用/ /
括起来正则式的内容。
几个常见的用法:
sed -e 'd' /tmp/passwd.bak # 对每一行执行删除,'d'就是删除命令,所以没有任何输出
sed -e '5d' /tmp/passwd.bak # 删除第五行
sed -e '1,5d' /tmp/passwd.bak # 删除第一行到第五行,闭区间
sed -e '/^#/d' /etc/rc.local # 删除所有的注释行,注意正则式/^#/
几个常用的正则式:
有几个其它的命令,比如-p
选项表示打印匹配上的行。
一个例子,打印main函数的内容:
sed -n -e '/main[[:space:]]*(/,/^)/p' /tmp/a.c | more
替换
以行为单位,执行文本流的替换,举个例子:
sed -e 's/power/jiecheng/g' /tmp/a.c
把所有的power
替换成jiecheng
。s
表示替换命令,g
表示全局操作,如果没有g
,则只替换第一个。
sed -e '1,10s/power/jiecheng/g' /tmp/a.c
和上个命令一样,只不过范围是1-10行了
sed -e '/main[[:space:]]*(/,/^)/s/power/jiecheng/g' /tmp/a.c
范围成了main函数内部了。
sed
可以修改分隔符,比如
sed -e 's:/usr/local:/usr:g' mylist.txt
把/usr/local
替换成/usr
,此时分隔符成了:
,当然也可以添加\
来转义操作。
注意一点,sed
正则替换的时候,默认替换全文的最长匹配,而不是每一行的匹配。举个例子:
main.html文件
<html>
<head>main page<head>
<body><b>This</b>is <b>main</b>page.</body>
</html>
我们打算去掉所有的标签,如果直接执行:
sed -e 's/<.*>//g' main.html
那么所有的都会被替换了,输出空。正确的匹配方式应该是:
sed -e 's/<[^>]*>//g' main.html
意思是,^>
表示非>
符号,遇到了就跳出任意字符的匹配,而匹配上了*
后的>
,直接替换匹配结束。
命令组合
有些时候,我们需要把多个命令应用到一行中,下面给出几个组合方式。第一个是使用分号分隔命令:
sed -n -e '=;p' /tmp/passwd.bak
输出行号,然后打印。