【问题标题】:Delete text outside of tags删除标签外的文本
【发布时间】:2013-05-23 18:30:55
【问题描述】:

使用 vim,我试图删除 <text> 块的 outside 的所有文本。这需要跨越换行符和其他(不相关的)标签。

我尝试使用正则表达式来替换换行符的文本,但由于几个原因失败了,其中一个是我的尝试没有跨越多行,我需要让我的匹配项不贪心。 (这是使用{-} 以某种方式完成的吗?)

应该匹配我要删除的内容的正则表达式看起来像:<//text>.*<text.*> 但如果我使这个匹配不贪婪,我可能会有其他问题。 (我也意识到我会在开始时清理一个部分标签部分。)

我应该采取另一种方法吗,或者有人可以指导我使用 vim 删除此类标签之间的所有内容 not

编辑:包括示例文本

<contributor>
        <username>MalafayaBot</username>
        <id>628</id>
      </contributor>
      <minor />
      <comment>Robô: A modificar Categoria:Vocábulo de étimo latino (Português) para Categoria:Entrada de étimo latino (Português)</comment>
      <text xml:space="preserve">={{-pt-}}=
==Substantivo==
{{flex.pt|ms=excerto|mp=excertos}}
{{paroxítona|ex|cer|to}} {{m}}
# [[extrato]] de um [[texto]], [[fragmento]]
#: ''A seguir, um '''excerto''' do texto original.''

===Tradução===
{{tradini}}
* {{trad|es|extracto}}
* {{trad|fr|extrait}}
{{tradmeio}}
* {{trad|en|excerpt}}
{{tradfim}}

=={{etimologia|pt}}==
:Do latim ''[[excerptu]]'' (colhido de).

=={{pronúncia|pt}}==
===Brasil===
* [[SAMPA]]: /e.&quot;sEx.tu/
* [[AFI]]: /esˈertu/
[[zh:excerto]]</text>
      <sha1>8i1zywj37s74ah4wnai11ohorfjn8j5</sha1>
      <model>wikitext</model>

【问题讨论】:

  • 请举个例子
  • 您的文件中是否只有一个&lt;text&gt; 块?
  • regex 确实不是最好的工具。这可能是一个有趣的阅读,为什么它不适合解析 html。 stackoverflow.com/questions/1732348/…
  • @Fdinoff 我在尝试解决了几个小时后才意识到这一点。我真的不需要 DOM 的全部功能,但看起来我需要一个不同的工具来解决这个问题。

标签: regex vim tags


【解决方案1】:

您对正则表达式的困扰表明您使用了错误的工具来完成这项工作。

对于从 XML 中提取文本,您可以使用 XSLT,它可以比正则表达式更好地处理所有特殊情况。或者使用专用工具,如xidel,一种用于 XML 的 grep。有了它,提取就这么简单:

xidel --extract "//text" input.xml

【讨论】:

  • 我相信你是对的。 XSLT 会更好地处理这个问题。伙计,我讨厌使用 XSL。无论如何,我会接受这个答案。
【解决方案2】:

如果您不需要 vim,您可以尝试使用此 sed 命令,只需将“test”替换为您的文件名。我将首先在您的文件的副本上对此进行测试,因为 -i 选项告诉 sed 修改您传入的实际文件。

sed -i 's/<\/text>[^<]*/<\/text>/g' test

编辑:看到示例后,我将采用不同的方法...而不是删除所有不在标签内的文本。我将选择所有块并将其输出到新的文件。希望您的 grep 版本支持 -P 选项。试试这个:

grep -Pzo "(?s)<text.*?<\/text>" sample.txt > out.txt

【讨论】:

  • 嗯,这似乎不起作用。我不确定是否删除了 anything。不过,它确实需要一段时间才能运行。 (文件长 900 万行。)
  • 我使用的示例测试文件如下所示:&lt;text&gt;loijefr ljlijef&lt;/text&gt;afefawefa&lt;text&gt;efaerfe&lt;/text&gt;eaee &lt;text&gt;aeeawre&lt;/text&gt;&lt;text&gt;afrer&lt;/text&gt; 是您的结束文本,如 或 ?
  • 文本标签中也有内容。如&lt;text annoying=true&gt;blahblahblah&lt;/text&gt;
  • 你能提供一个示例 sn-p ...当然是伪造信息 =)
【解决方案3】:

我假设您的文件中只有一个 &lt;text&gt; 块。在 vim 中,这一行适用于您的示例文本:

%s#\_.*\(<text.\{-}>\_.*</text>\)\_.*#\1#

【讨论】:

  • 可悲的是,它们有成千上万个。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多