LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1825|回复: 9

如何用shell去掉xml配置文件里注释内容?

[复制链接]
发表于 2010-1-5 20:57:19 | 显示全部楼层 |阅读模式
xml配置文件的注释,即(<!-- -->),这种注释可能是单行,比如[PHP]<!--propname="db.jdbc.url">jdbc:apache:commons:dbcp:local</prop-->[/PHP]
可能是占用多行,形成一个段落的:比如 [PHP]<!--prop name="db.jdbc.driver"/>
</access>
-->[/PHP]
也可能是嵌套注释的.
比如 [PHP]<!--prop name="d<!--b.jdbc.driver"/>
</access>
-->fdsf
-->[/PHP]
如果嵌套的太难,可以不考虑这种情况,但是前两种需要考虑,哪位兄弟帮个忙?
发表于 2010-1-5 22:21:59 | 显示全部楼层
用perl吧,确认要perl XML : DOM 模块安装了。
文件 xcr.pl
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use XML::DOM;
  5. my $file = shift;
  6. my $parser = new XML::DOM::Parser;
  7. my $doc = $parser->parsefile($file);
  8. remove_comments($doc);
  9. print $doc->toString();
  10. sub remove_comments {
  11. my ($doc) = @_;
  12. foreach my $node ( $doc->getChildNodes() ) {
  13. if ( $node->getNodeType() == ELEMENT_NODE ) {
  14. remove_comments($node);
  15. }
  16. elsif ( $node->getNodeType() == COMMENT_NODE ) {
  17. $doc->removeChild($node);
  18. }
  19. }
  20. }
复制代码

用法 perl xcr.pl old.xml > new.xml

chmod 755 ./xcr.pl
./xcr.pl old.xml > new.xml
回复 支持 反对

使用道具 举报

发表于 2010-1-5 22:49:00 | 显示全部楼层
不考虑嵌套:awk -v RS='-->' -v ORS=' ' '{sub("<!--.*$","");print}'
回复 支持 反对

使用道具 举报

发表于 2010-1-6 01:52:22 | 显示全部楼层

  1. perl -i.orig -0\npe 's/<!--.*?-->//sg' path_to_your_file
复制代码
回复 支持 反对

使用道具 举报

发表于 2010-1-6 05:34:50 | 显示全部楼层

我用sed来解决

原始文件file.xml:

  1. start1.a
  2. <!--propname="db.jdbc.url">jdbc:apache:commons:dbcp:local</prop-->  
  3. end1.a
  4. start1.b
  5. <!--propname="db.jdbc.url">jdbc:apache:commons:dbcp:local</prop-->  
  6. end1.b
  7. start2.a
  8. <!--prop name="db.jdbc.driver"/>
  9. </access>
  10. -->  
  11. endl2.a
  12. start2.b
  13. <!--prop name="db.jdbc.driver"/>
  14. </access>
  15. -->  
  16. end2.b
  17. start3.a
  18. <!--prop name="d<!--b.jdbc.driver"/>
  19. </access>
  20. -->fdsf
  21. -->  
  22. end3.a
  23. start3.b
  24. <!--prop name="d<!--b.jdbc.driver"/>
  25. </access>
  26. -->fdsf
  27. -->  
  28. end3.b
复制代码

-----------------
因为我发现/<!--/,/-->/无法匹配第一种,所以要将第一种变为
<!--
-->
的形式

  1. sed -i '/-->/ a -->' file.xml
复制代码

得到预处理后的文本

  1. start1.a
  2. <!--propname="db.jdbc.url">jdbc:apache:commons:dbcp:local</prop-->  
  3. -->
  4. end1.a
  5. start1.b
  6. <!--propname="db.jdbc.url">jdbc:apache:commons:dbcp:local</prop-->  
  7. -->
  8. end1.b
  9. start2.a
  10. <!--prop name="db.jdbc.driver"/>
  11. </access>
  12. -->  
  13. -->
  14. endl2.a
  15. start2.b
  16. <!--prop name="db.jdbc.driver"/>
  17. </access>
  18. -->  
  19. -->
  20. end2.b
  21. start3.a
  22. <!--prop name="d<!--b.jdbc.driver"/>
  23. </access>
  24. -->fdsf
  25. -->
  26. -->  
  27. -->
  28. end3.a
  29. start3.b
  30. <!--prop name="d<!--b.jdbc.driver"/>
  31. </access>
  32. -->fdsf
  33. -->
  34. -->  
  35. -->
  36. end3.b
复制代码

----------------
接下来开始删除:
首先删除
<!--
-->的模式

  1. sed -i '/<!--/,/-->/ d' file.xml
复制代码

得到:

  1. start1.a
  2. end1.a
  3. start1.b
  4. end1.b
  5. start2.a
  6. -->
  7. endl2.a
  8. start2.b
  9. -->
  10. end2.b
  11. start3.a
  12. -->
  13. -->  
  14. -->
  15. end3.a
  16. start3.b
  17. -->
  18. -->  
  19. -->
  20. end3.b
复制代码

接下来删除所有含-->的行

  1. sed -i '/-->/ d' file.xml
复制代码

大功告成:

  1. start1.a
  2. end1.a
  3. start1.b
  4. end1.b
  5. start2.a
  6. endl2.a
  7. start2.b
  8. end2.b
  9. start3.a
  10. end3.a
  11. start3.b
  12. end3.b
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-6 18:36:38 | 显示全部楼层
这是我现在采用的方法[PHP]sed 's/<!--.*-->//g' applicationConfig.config > test.config[/PHP]
回复 支持 反对

使用道具 举报

发表于 2010-1-7 01:24:59 | 显示全部楼层
这个对单行可以,多行的不行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-7 11:27:17 | 显示全部楼层
songtime的方法不能处理如下情况,会把前面的内容删除:
[PHP]    <scheduleSpaceTime>2</scheduleSpaceTime><!--
    调度器执行间隔时间 单位(分钟) -->[/PHP]

受songtime启发,我现在的做法:

1:[PHP]sed  's/<!--/\n<!--\n/' applicationConfig.config>1.config[/PHP]

2:[PHP]sed  's/-->/\n-->\n/' 1.config>2.config[/PHP]

3:[PHP]sed  '/<!--/,/-->/ d' 2.config> 3.config[/PHP]
4:[PHP]sed  '/-->/ d' 3.config > 4.config[/PHP]

现在的做法应该是支持嵌套的了。
回复 支持 反对

使用道具 举报

发表于 2010-1-8 02:01:57 | 显示全部楼层
添加换行万无一失了,不错
学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-8 16:10:34 | 显示全部楼层
Post by lastart;2062266
不考虑嵌套:awk -v RS='-->' -v ORS=' ' '{sub("<!--.*$","");print}'


在不考虑嵌套的情况下,这是一种非常优雅的实现。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表