使用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."sEx.tu/
* [[AFI]]: /esˈertu/
[[zh:excerto]]</text>
<sha1>8i1zywj37s74ah4wnai11ohorfjn8j5</sha1>
<model>wikitext</model>
答案 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#