免费注册 查看新帖 |

Chinaunix

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

如何对文件内容以块儿的形式操作-请高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-18 00:57 |只看该作者 |倒序浏览
具体例子如apache的VirtualHost配置:
<VirtualHost 1.2.3.4>;
ServerName fox.com
................
.................
</VirtualHost>;

<VirtualHost 1.2.3.4>;
ServerName dog.com
................
.................
</VirtualHost>;

这种形式,用sed '/^<Vir/,/^<\/Vir/ {/fox.com/d} ' 只能删除匹配块中的一行,无法删除符合条件的整个<VirtualHost 1.2.3.4>;。。。。</VirtualHost >;段,在脚本技术范围内有什么办法可以实现吗?非常感谢!

论坛徽章:
0
2 [报告]
发表于 2005-04-18 16:51 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

$flag = 0;
while(<>{
$flag =1 if /^<Vir/;
print unless $flag;
$falg = 0 if /^<\Vir/;
}
you can also use grep function of perl

论坛徽章:
0
3 [报告]
发表于 2005-04-18 22:05 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

这样只能删除所有的
<VirtualHost>;
........
............
</VirtualHost>;
段落,假设有很多这样的段落,我只想删除其中的有特征行的一段呢?

比如:
<VirtualHost>;
servername fox.com
......
....
</VirtualHost>;
就是servername为fox.com的一段该如何做呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-04-19 10:46 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

1.用array存整個config..
2.在儲存每個VirtualHost的起點,可以一行一行讀取
   同時尋找servername fox.com這一行..
3.找到後..回頭找最後一個VirtualHost的起點...開始刪除資料...
   直到找到</VirtualHost>;
簡單吧...

论坛徽章:
0
5 [报告]
发表于 2005-04-19 14:20 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

原帖由 "apile" 发表:
1.用array存整個config..
2.在儲存每個VirtualHost的起點,可以一行一行讀取
   同時尋找servername fox.com這一行..
3.找到後..回頭找最後一個VirtualHost的起點...開始刪除資料...
   直到找到</VirtualHos..........

也可以用aoa(array of array), 把每个块放到一个array里面,再把array放到另
一个array里面分析每个“块array”, 不合适的就splice掉

论坛徽章:
0
6 [报告]
发表于 2005-04-25 04:01 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

非常感谢!

论坛徽章:
0
7 [报告]
发表于 2005-04-25 04:10 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

1.用array存整個config..
2.在儲存每個VirtualHost的起點,可以一行一行讀取
  同時尋找servername fox.com這一行..
3.找到後..回頭找最後一個VirtualHost的起點...開始刪除資料...
  直到找到</VirtualHost>;
簡單吧...


这种方法不太明白,能给一个小例子吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-04-25 10:28 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

原帖由 "iamafox" 发表:
1.用array存整個config..
2.在儲存每個VirtualHost的起點,可以一行一行讀取
  同時尋找servername fox.com這一行..
3.找到後..回頭找最後一個VirtualHost的起點...開始刪除資料...
  直到找到</VirtualH..........


  1. #!c:\perl\bin\perl.exe

  2. unless(open(conf, "config.xml")) {
  3.         die("NO this file!\n");
  4. }
  5. unless(open(new, "new.xml")) {
  6.         die("CAN'T open new file!\n");
  7. }

  8. @file = <conf>;;

  9. $flag = 1;
  10. $i = 0;
  11. $p = 0;
  12. $del = 0;
  13. @tmp = ();
  14. $t = 0;
  15. while ($i < @file) {
  16.         $line = @file[$i++];
  17.         if ($line == "<VH>;") {
  18.                 $flag = 1;
  19.         }
  20.         if ($line == ".com") {
  21.                 $del = 1;
  22.         }
  23.         if ($line == "</VH>;") {
  24.                 $flag = 0;
  25.                 $t = 0;
  26.         }

  27.         if ($flag) {
  28.                 @tmp[$t++] = $line;
  29.         }
  30.         elsif (!$del){
  31.                 print new $line;
  32.         }
  33. }

  34. close(conf);
  35. close(new);
复制代码


^_^,刚学习两天。不知道写的对不对,也没测试呢。可以吧需要的地方换成模式匹配。

论坛徽章:
0
9 [报告]
发表于 2005-04-26 10:37 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

收获不小,谢谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2005-05-04 18:24 |只看该作者

如何对文件内容以块儿的形式操作-请高手指点

<VirtualHost 1.2.3.4>;
ServerName fox.com
................
.................
</VirtualHost>;

<VirtualHost 1.2.3.4>;
ServerName dog.com
................
.................
</VirtualHost>;

菜鸟弱问:怎么用正则表达式来匹配:

  1. <VirtualHost 1.2.3.4>;
  2. ServerName fox.com
复制代码

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP