Chinaunix首页 | 论坛 | 博客
  • 博客访问: 968982
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-07-17 10:51:57

一个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用来匹配两个地址,在这两个地址之间的行首都被加上#号
阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~