[英]Perl non-greedy Regex
因此,我終於讓我的老板批准為此目的使用perl而不是sed。
這是基本的雜項。
我有這樣的行:
<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div>
這太亂了,但我沒有寫。 無論哪種方式,都有很多這樣的頁面,需要將其更改為以下格式:
<p>Sometext</p><p>Some more text</p>
顯然,這需要不貪心。 現在,我想出了這條線來幫助解決這個問題:
perl -nle "s/(.*)<div class=\"SectionText\">(.*?)<\/div>(.*)/\1<p>\2<\/p>\3/ig; print $1" "somefile.html" > otherfile.html
但是,此操作不執行任何操作,並且所有SectionText標簽仍然保留。
請注意,正則表達式遠非適合處理HTML。 正確的方法是使用解析器並處理DOM,但是對於簡單且行為良好的情況,您可以不使用正則表達式。 只是要進一步了解這是設計的弱點,並且可能會導致意外的問題。
無需捕獲和還原要編輯區域之外的文本。 只需將<div>
元素替換為具有相同內容的<p>
元素。 只要選擇其他定界符,也無需轉義雙引號或斜杠。
在替換字符串中使用\\1
, \\2
等也是錯誤的。 $1
, $2
等都屬於這里,如果您在命令行上使用-w
,將會被警告過。
這應該為你工作
perl -pe 's|<div class="SectionText">(.*?)</div>|<p>$1</p>|ig' somefile.html > otherfile.html
有關輸出方法,請參見HTML :: TreeBuilder :: XPath和HTML :: Element 。
my $t = HTML::TreeBuilder::XPath
->new_from_content('<div class="SectionText">Sometext</div><div class="SectionText">Some more text</div>');
for ($t->findnodes('//div[@class="SectionText"]')) {
$_->tag('p');
$_->attr(class => undef);
}
若要使其100%正確,應在空白處拆class
屬性值,刪除類名稱SectionText
,然后重新組合屬性值。 我認為在您的情況下,您可以刪除上面的代碼中的class
屬性,從而擺脫困境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.