删除标签外的文字

时间:2013-05-23 18:30:55

标签: regex vim tags

使用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>

3 个答案:

答案 0 :(得分:2)

你对正则表达式的挣扎表明你正在使用错误的工具来完成工作。

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

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

答案 1 :(得分:1)

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

sed -i 's/<\/text>[^<]*/<\/text>/g' test
编辑:看完样本之后,我将采取不同的方法......而不是删除不在标签内的所有文本..我将选择所有块并将其输出到新的文件。希望您的grep版本支持-P选项。试试这个:

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

答案 2 :(得分:0)

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

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