【问题标题】:Delete an HTML element containing a pattern删除包含模式的 HTML 元素
【发布时间】:2017-10-02 23:53:25
【问题描述】:

如何删除文本中包含PATTERN 的元素(从<span></span>)?元素的内容应该随着元素一起被删除。

例如我想删除下面的第一个<span>...</span>元素:

<span><SPAN>some text with
with </SPAN> a PATTERNin it etc</span><span><SPAN>some text
without </SPAN> a thingIn it etc</span>

仅使用 SED 进行生产:

<span><SPAN>some text
without </SPAN> a thingIn it etc</span>

PS:对行尾或单字没有帮助,它只能检测到任何&lt;span&gt;...&lt;/span&gt;PATTERN

生产服务器只允许使用 SED 等基本命令。 我目前正在使用以下方法,但它很丑而且似乎不起作用。

sed '/<span.*\n.*PATTERN.*<\/span>/d'

【问题讨论】:

  • 什么是“应答器”?期望的输出应该是什么样的?
  • 您的描述不清楚。这一切是什么意思?
  • 你尝试了什么?展示你的努力并发送minimal reproducible example
  • 增加了清晰度、结果和进度
  • 可惜。如果它是 XHTML(以显示它是多么愚蠢),可能会尝试编写一个基于 sed 的解析器来获得乐趣,但是 HTML 要复杂得多,你说你甚至没有 HTML?那么,您希望我们如何解析它??

标签: html regex sed


【解决方案1】:

如果是 HTML:

perl -MXML::LibXML -e'
   my $parser = XML::LibXML->new();
   my $doc = $parser->parse_html_file($ARGV[0]);
   $_->unbindNode()
      for $doc->findnodes(q{//span[contains(text(), "PATTERN")]});

   binmode(STDOUT);
   print($doc->toString());
' in.html >out.html

如果是 XHTML:

perl -MXML::LibXML -e'
   my $parser = XML::LibXML->new();
   my $doc = $parser->parse_file($ARGV[0]);
   my $xpc = XML::LibXML::XPathContext->new();
   $xpc->registerNs( h => "http://www.w3.org/1999/xhtml" );
   $_->unbindNode()
      for $xpc->findnodes(q{//h:span[contains(text(), "PATTERN")]}, $doc);

   binmode(STDOUT);
   print($doc->toString());
' in.xhtml >out.xhtml

以上都产生以下内容(一些隐含的元素被激活):

<span><SPAN>some text
without </SPAN> a thingIn it etc</span>

【讨论】:

  • 我明白你的意思(很好),但我在一个不能使用 perl 而只能使用标准 bash 命令的服务器上...
  • 1) 我以为你想使用sed,而不是bash? 2) 我不是在bash(那会很傻)或sed(可能甚至不可能)中编写 HTML 解析器。
  • sed 在我允许的命令范围内。遗憾的是,我无法为生产服务器选择所有内容...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多