vim搜索替换包括换行符

时间:2015-09-07 08:53:31

标签: regex vim

我现在谷歌搜索了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但没有成功。

1 个答案:

答案 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;。