我现在谷歌搜索了3个小时没有成功。 我有一个巨大的文件,它是许多XML文件的串联。
因此我想搜索替换<?xml [whatever is between]<body>
的所有出现(包括那些词)。
然后</body>[whatever is between]</html>
(包括那些词)相同。
我最接近的是
:%s/<?xml \(.*\n\)\{0,180\}\/head>//g
FYI如果我试试这个:
:%s/<?xml \(\(.*\)\+\n\)\+\/head>\n//g
我得到E363: pattern uses more memory than 'maxmempattern'
。
我试图关注this但没有成功。
答案 0 :(得分:3)
要匹配任意数量的符号,包括<?xml
和<body>
之间的换行符,您可以使用
:%s/<?xml \_.*<\/head>//g
\_.*
可用于匹配任何符号,包括换行符。要匹配尽可能少的符号,请使用.\{-}
::%s/<?xml \_.\{-}<\/head>//g
。
请参阅Vim wiki,Patterns including end-of-line部分:
\_.
任何包含换行符的字符
从Vim正则表达式的帮助,4.3 Quantifiers, Greedy and Non-Greedy section:
\{-}
匹配前面原子的0或更多,尽可能少
<强>更新强>
就转义正则表达式元字符而言,您可以参考Vim Regular Expression Special Characters: To Escape or Not To Escape帮助页面。您可以看到列表中缺少}
。为什么?因为正则表达式引擎通常能够从上下文中分辨出它是什么类型的}
。它知道它是否以\{
开头,并且可以正确解析表达式。因此,没有理由逃脱这种关闭支撑,这使得模式保持清洁&#34;。