想要在一个起始点之后清理所有内容直到最后一个
示例:
<!--
<group>
<name>Octopus</name>
<inventory>
<inventoryName>octopus</inventoryName>
<decoder>DFFDD</decoder>
<command>cat /etc/hosts</command>
</inventory>
</group>
-->
其中<!--
是起点,-->
是终点,有时内容是到终点的多行。
我希望删除那些标签中的所有内容。
我尝试用sed开始一些事情:
sed 's/^<\!--//g'
但不知道如何继续捕捉所有内容并在看到结束标记时进行清理。
答案 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:
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>