开始后直到结束点清洁一切

时间:2013-07-19 12:22:13

标签: perl bash sed awk

想要在一个起始点之后清理所有内容直到最后一个

示例:

    <!--
        <group>
                <name>Octopus</name>
                <inventory>
                        <inventoryName>octopus</inventoryName>
                        <decoder>DFFDD</decoder>
                        <command>cat /etc/hosts</command>
                </inventory>
        </group>
 -->

其中<!--是起点,-->是终点,有时内容是到终点的多行。 我希望删除那些标签中的所有内容。

我尝试用sed开始一些事情:

sed 's/^<\!--//g'但不知道如何继续捕捉所有内容并在看到结束标记时进行清理。

5 个答案:

答案 0 :(得分:3)

非贪婪替换正则表达式.甚至匹配换行符,

$string =~ s|<!-- .*? -->||xsg;

答案 1 :(得分:3)

如果我得到你想做的事,你想删除评论。正确?

这样的事情怎么样?

<!--
     blah blah blah -->

或者

<!-- blah blah blah -->

或者

<!-- blah blah blah
-->

甚至是这个?

 <foo><bar> <!-- <fubar>blah blah</fubar> --> </bar></foo>

您不能在XML上使用正则表达式,因为XML太复杂了。有很多Perl库可以解析XML数据,你应该使用它们。

虽然它不再是首选,但XML::Simple可能完全符合您的要求,绝对最低限度。 XML::Simple可以将您的XML文件重建为 兼容 版本。实体可能不完全匹配,但它将与您的旧结构兼容。并且,XML :: Simple删除了注释。

use strict;
use warnings;
use XML::Simple;

my $xml_struct_ref = XMLin( $xml_file );
my $xml_file_output = XMLout ( $xml_struct_ref );

然后,您只需将$xml_file_output写入新的XML文件即可。删除所有评论!

答案 2 :(得分:3)

GNU代码

sed -r '/<!--/,/-->/{//!d;s/(.*<!--).*/\1/;s/.*(-->.*)/\1/}' file

会话协议:

    $ cat file
    test line #1
    <AXXX> <!--  <BXXX>
        <group>
            <name>Octopus</name>
            <inventory>
                <inventoryName>octopus</inventoryName>
                <decoder>DFFDD</decoder>
                <command>cat /etc/hosts</command>
            </inventory>
        </group>
    <CXXX> --> <DXXX>
    test line 12
$ sed -r '/<!--/,/-->/{//!d;s/(.*<!--).*/\1/;s/.*(-->.*)/\1/}' file
test line #1
<AXXX> <!--
--> <DXXX>
test line 12

答案 3 :(得分:1)

Perl解决方案:

#!/usr/bin/env perl

use strict;
use warnings;

my $filename = $ARGV[0];

open FILE, "<$filename" or die $!;
local $/;
my $text = <FILE>;
close FILE;

$text =~ s/<!--[\s\S]*?-->//g;

open FILE, ">$filename" or die $!;
print FILE $text;
close FILE;

您需要[\s\S]*?(或(.|\n))才能获得任何字符的最短匹配,包括换行符。仅.不适用于多行字符串,因为它匹配除换行符之外的任何字符。

运行如下脚本:

./script.pl /path/to/your.file

答案 4 :(得分:1)

HTML::Parser中,您可以找到类似的代码段:

perl -0777 -MHTML::Parser -nE 'HTML::Parser->new(default_h=>[sub{print shift},"text"],comment_h=>[""])->parse($_)||die $!' < file.html >decommented.html

在下一个html上测试:

simple
<!-- this is an comment -->
multi
<!--
this is an
multiline comment
-->
stupid
<img src="copen.jpg" alt='image of open tag <!--'>
<img src="cclose.jpg" alt='image of closing tag -->'>
js
<script>
alert("<!-- here -->");
</script>
end

并打印:

simple

multi

stupid
<img src="copen.jpg" alt='image of open tag <!--'> <img src="cclose.jpg" alt='image of closing tag -->'>
js
<script>
alert("<!-- here -->");
</script>