<div>
...
</div>
<div class="row"> _
<div class="col... |
... Text1 | unknown number of lines containing
... | <div>...Text1...</div> to be removed
</div> _|
</div>
我知道,如果一切都在同一行中,grep -oP '<di(?:(?!<di).)*?\/div>' test.html | grep -ioP '.*Text1.*'將選擇進一步處理,但不知道多行。米蒂亞。
uj5u.com熱心網友回復:
是的 Perl 可以做到這一點,用于快速命令列黑客。對于認真使用(編程),請參閱H?kon H?gland的答案。
perl -e 'undef $/; $_=<>; /.*(<.*?Text1.*?>)/s; print "$1\n"' < infile
以您的示例為例infile,輸出為:
<div class="col...
... Text1
...
</div>
或者如果你想洗掉片段,那么
perl -e 'undef $/; $_=<>; s/(.*)<.*?Text1.*?>/$1/s; print' < infile
<div>
...
</div>
<div class="row">
</div>
uj5u.com熱心網友回復:
下面是一個示例,說明如何XML::LibXML在 Perl 中使用提取div包含帶有“Text1”文本的最里面的標簽:
use feature qw(say);
use strict;
use warnings;
use XML::LibXML;
my $xml = '
<sample>
<div>
some text
</div>
<div >
<div >
Text1
</div>
</div>
</sample>';
my $doc = XML::LibXML->load_xml(string => $xml);
for my $node ($doc->findnodes('//div[not(descendant::div)]')) {
#my $txt = $node->toString();
my $txt = $node->textContent();
say $txt if $txt =~ /\QText1\E/;
}
輸出:
Text1
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed '/^<div/{:a;N;/^<\/div/M!ba;s/^\(.*\)\n<div.*Text1.*/\1/}' file
收拾行開始之間的界限<div,并</div和他們是否包含字串Text1,洗掉它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393744.html
