perl -0777 -i.withdiv -pe 's{<div[^>]+?id="user-info"[^>]*>.*?</div>}{}gsmi;' test.html
-0777
意味着什么都不分割,所以在整个文件中啜饮(而不是逐行,默认为 -p
-i.withdiv
意味着更改文件,保留扩展名为 .withdiv 的原始文件(-p 的默认设置是仅打印)。
-p
表示逐行传递(除了我们是 slurping)传递的代码(见 -e)
-e
期望代码运行。
man perlrun
或perldoc perlrun
了解更多信息。
这是另一种解决方案,对于了解jquery的人来说会稍微熟悉一些,因为语法是相似的。这使用 Mojoliciousojo
模块将 html 内容加载到 Mojo::DOM 对象中,对其进行转换,然后打印转换后的版本:
perl -Mojo -MFile::Slurp -E 'for (@ARGV) { say x(scalar(read_file $_))->at("#user-info")->replace("")->root; }' test.html test2.html test*.html
直接替换内容:
perl -Mojo -MFile::Slurp -E 'for (@ARGV) { write_file( $_, x(scalar(read_file $_))->at("#user-info")->replace("")->root ); }' test.html
注意,这不仅会删除div,还会根据 Mojo 的 Mojo::DOM 模块重新编写内容,因此标签属性的顺序可能不同。具体来说,我看到<div id="user-info2" class="logged-in">
重写为<div class="logged-in" id="user-info2">
.
Mojolicious 至少需要 perl 5.10,但在那之后就没有非核心要求了。