免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20941 | 回复: 13
打印 上一主题 下一主题

[文本处理] SED匹配替换多行的问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-24 16:12 |只看该作者 |倒序浏览
譬如:
<Directory />
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    Options -Indexes
</Directory>

用:sed -n '/<Directory /,/<\/Directory>/'p 可以找到上面这些行。
但是我的目的是把<Directory />...</Directory>中间包含的内容替换掉,而且httpd.conf中包含多个<Directory...>区段都需要替换中间包含的内容为如下:
<Directory />
    Options None
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

两个问题:
1、如何只处理匹配到的去掉关键字的中间内容?
2、如何替换多行?

谢谢!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-07-24 16:29 |只看该作者
sed  '/<Directory /,/<\/Directory>/{/<Directory /!d}
/<Directory /a \
    Options None\
    AllowOverride None\
    Order deny,allow\
    Deny from all\
</Directory>
' urfile

论坛徽章:
0
3 [报告]
发表于 2012-07-24 17:16 |只看该作者
回复 2# waker


不好意思,我没说清楚;
原来的<Directory ...> </Directory>的头和尾两行要保留原有内容(因为Directory是不同的),就是说只是替换中间包含的内容。
兄台你的这条语句把头尾两行都替换掉了。   

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
4 [报告]
发表于 2012-07-24 17:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2012-07-24 17:48 |只看该作者
回复 3# blazewater


    稍作修改即可:
  1. sed  '/<Directory /,/<\/Directory>/{
  2. /<Directory /a \
  3.     Options None\
  4.     AllowOverride None\
  5.     Order deny,allow\
  6.     Deny from all
  7. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-07-24 18:48 |只看该作者
本帖最后由 blazewater 于 2012-07-24 18:49 编辑

回复 5# blackold
感谢回复。
我试了一下,兄台给的代码是在后面增加内容,而非替换。
我举个例子再说明下我的需求:
源:
<Directory /TESTDIR>
    Options Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
    Options -Indexes
</Directory>

目标:
<Directory /TESTDIR>
    Options None
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>
其中:/TESTDIR是可变的,因此要求只是替换红色部分为蓝色部分,但是查找的条件却是<Directory ...>和</Directory>

感谢!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2012-07-24 20:05 |只看该作者
回复 6# blazewater


    汗,是我搞错了。

sed -f scr.sed urfile
scr.sed
/<Directory \/>/,/<\/Directory>/c \
<Directory />\
    Options None\
    AllowOverride None\
    Order deny,allow\
    Deny from all\
</Directory>


论坛徽章:
0
8 [报告]
发表于 2012-07-24 20:28 |只看该作者
回复 7# blackold

老兄的理解还是有误。
匹配到的内容第一行和最后一行(这两行是匹配的内容)是要保留原样的,被替换的只是被这两行包围的内容。
而这两行在同一个文件中是有多个的。
如下示例:
  1. <Directory /TEST1>
  2.     Options Indexes FollowSymLinks
  3.     AllowOverride None
  4.     Order deny,allow
  5.     Allow from all
  6.     Options -Indexes
  7. </Directory>
  8. <Directory /TEST2>
  9.     Options Indexes FollowSymLinks
  10.     AllowOverride None
  11.     Order deny,allow
  12.     Allow from all
  13.     Options -Indexes
  14. </Directory>
  15. <Directory /TEST3>
  16.     Options Indexes FollowSymLinks
  17.     AllowOverride None
  18.     Order deny,allow
  19.     Allow from all
  20.     Options -Indexes
  21. </Directory>
复制代码
这种情况下我需要匹配的模式是:以"<Directory "开头、以</Directory>结尾、但是不包含首尾两行的内容。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2012-07-24 20:53 |只看该作者
回复 8# blazewater

哦,是有的差别,自己改一下就行了。

scr.sed
  1.   /<Directory /,/<\/Directory>/c \
  2.     <Directory />\
  3.         Options None\
  4.         AllowOverride None\
  5.         Order deny,allow\
  6.         Deny from all\
  7.     </Directory>
复制代码

论坛徽章:
0
10 [报告]
发表于 2012-07-24 21:39 |只看该作者
回复 9# blackold
还是不对的。
就拿上面的TEST1、TEST2、TEST3的例子,运行后结果如下:
  1. iMac:script usera $ cat a
  2. <Directory /TEST1>
  3.     Options Indexes FollowSymLinks
  4.     AllowOverride None
  5.     Order deny,allow
  6.     Allow from all
  7.     Options -Indexes
  8. </Directory>
  9. <Directory /TEST2>
  10.     Options Indexes FollowSymLinks
  11.     AllowOverride None
  12.     Order deny,allow
  13.     Allow from all
  14.     Options -Indexes
  15. </Directory>
  16. <Directory /TEST3>
  17.     Options Indexes FollowSymLinks
  18.     AllowOverride None
  19.     Order deny,allow
  20.     Allow from all
  21.     Options -Indexes
  22. </Directory>
复制代码
  1. iMac:script usera $ cat scr.sed
  2.   /<Directory /,/<\/Directory>/c \
  3.     <Directory />\
  4.         Options None\
  5.         AllowOverride None\
  6.         Order deny,allow\
  7.         Deny from all\
  8.     </Directory>
复制代码
  1. iMac:script usera $ sed -f scr.sed ./a
  2. <Directory />
  3. Options None
  4. AllowOverride None
  5. Order deny,allow
  6. Deny from all
  7. </Directory>
  8. <Directory />
  9. Options None
  10. AllowOverride None
  11. Order deny,allow
  12. Deny from all
  13. </Directory>
  14. <Directory />
  15. Options None
  16. AllowOverride None
  17. Order deny,allow
  18. Deny from all
  19. </Directory>
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP