【问题标题】:Remove <pre>...</pre> blocks with shell commands使用 shell 命令删除 <pre>...</pre> 块
【发布时间】:2018-11-12 23:54:43
【问题描述】:

我想改变

Example 1 
<pre class="code">
bla bla 
</pre>
Example 2 
<pre>
bla bla 
</pre>

只是

Example 1 
Example 2 

所以我需要非贪婪匹配和正则表达式。我很确定我不能使用 sed - 我可以使用哪些 shell 命令?

【问题讨论】:

  • 为什么不能使用sedgrep -v呢?
  • 它是 HTML;使用 HTML 解析器,而不是像 sedgrep 这样的面向行的工具。
  • 是的,你是对的 - 我试图走捷径,结果它咬了我一口。 +1!

标签: html regex shell perl


【解决方案1】:

所以我需要非贪婪匹配一个正则表达式。

不是真的。假设&lt;pre&gt;&lt;/pre&gt; 标签总是在一行中,没有cmets 或其他HTML 标签,你不需要担心不转义的HTML 实体,你可以使用例如

perl -ne 'print unless m{^\s*<pre\b} .. m{^\s*</pre>}'

但是使用真正的 HTML 解析器可能是一个更好的主意:

perl -MHTML::Parser -e 'HTML::Parser->new(ignore_elements => ["pre"], default_h => [sub { print @_ }, "text"])->parse_file(*STDIN)' < input.html

(详细信息取决于您希望文档的其余部分发生什么。)

【讨论】:

  • 经过更多测试后,我意识到我使用解析器会更好 - 我要么遗漏了一些东西,要么删除了太多东西,试图用第一个命令来做。而且您的解析器命令非常完美——我刚刚将"code" 添加到ignore_elements 列表中。
猜你喜欢
  • 1970-01-01
  • 2020-11-28
  • 2015-01-23
  • 2019-05-22
  • 2020-05-31
  • 1970-01-01
  • 2010-10-20
  • 2015-05-28
  • 2019-12-27
相关资源
最近更新 更多