一个sed的很好的例子
在CU shell版的一个帖子中,有如下:
在apache的配置文件中有
AllowOverride None
OptionsNone
Orderallow,deny
Allow fromall
这些,我想在需要的行前面都加上#,比如前面这一段,但整个配置文件其他行并不做修改,对于sed应该如何写呢?
#
#AllowOverride None
#OptionsNone
#Orderallow,deny
#Allow fromall
#
这是最后实现的结果
然后下面是一个正确的解决办法:
[cocobear@cocobear test]$ cat httpd.conf
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
AllowOverride None
OptionsNone
Orderallow,deny
Allow fromall
Optioin Index
Allow all
[cocobear@cocobeartest]$ sed -r '/^(
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
#
#AllowOverride None
#OptionsNone
#Orderallow,deny
#Allow fromall
#
Optioin Index
Allow all
可见,正确的命令是:
sed -r '/^(
-r意思是使用extended regular expression
/^(
{s/^/#/;:a;n;/^$/!s/^/#/;ta}中,首先将匹配了
:a 是在这里加一个label
n 的意思是将pattern space中的当前行去掉,读入下一行到pattern space中用来处理,pattern space和hold space是sed使用的2个缓冲区,一般来说,sed每次读取1行到pattern space中,然后用命令处理,处理完成后,将pattern space中的结果输出到标准输出,然后从pattern space中删除内容,然后读取下一行到pattern space中,开始一个新的循环处理.
/^$/!s/^/#/ 中,/^$/!用来匹配那些非空行,/^$/匹配空行,而!用来取反。
在这个匹配之后s/^/#/是针对非空行要做得命令,即每行首加#
ta 意思是所如果前面的匹配和操作运行成功,即成功匹配了,那么就跳转到:a 处,否则就算本次cycle结束了,会自动从文件中读下一行,然后尝试去从新匹配
最后还给出了一个简化的命令:
简化一下:
sed '/^/s/^/#/; ' httpd.conf
使用了pattern用来匹配两个地址,在这两个地址之间的行首都被加上#号
阅读(925) | 评论(0) | 转发(0) |