2

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

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

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

我应该采取另一种方法,还是有人可以指导我使用vim删除不在此类标签之间的所有内容?

编辑:包括示例文本

<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>
4

3 回答 3

2

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

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

xidel --extract "//text" input.xml
于 2013-05-24T06:57:00.337 回答
1

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

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

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

grep -Pzo "(?s)<text.*?<\/text>" sample.txt > out.txt
于 2013-05-23T19:00:13.537 回答
0

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

%s#\_.*\(<text.\{-}>\_.*</text>\)\_.*#\1#
于 2013-05-23T20:55:13.517 回答