【问题标题】:VIM - Replace based on a search regexVIM - 基于搜索正则表达式替换
【发布时间】:2015-02-16 03:05:28
【问题描述】:

我有一个包含几条(1000 多条)记录的文件,例如:

lbc3.*'

ssa2.*'

lie1.*'

sld0.*'

ssdasd.*'

我可以通过以下方式找到它们:

/s[w|l].*[0-9].*$

我想要做的是将找到的每个模式的最后部分替换为 \.*'

我不能这样做 :%s//s[w|l].*[0-9].*$/\\\\\.\*' 因为它会替换所有字符串,而我只需要替换它的结尾 .' 到 \.'

所以文件输出是一样的:

lbc3\\.*'

ssa2\\.*'


lie1\\.*'

sld0\\.*'

ssdasd\\.*'

谢谢。

【问题讨论】:

  • s[w|l] 如何匹配lbc3?在你的例子中,它肯定只会匹配一行吗?
  • 为什么要更改ssdasd\\.*'s[w|l] 是什么意思?
  • 这基本上是重复的:stackoverflow.com/questions/27525223

标签: regex search vim vi


【解决方案1】:

一般来说,解决方案是使用捕获。将\(...\) 放在与您要保留的内容匹配的正则表达式部分周围,并使用\1 在替换字符串中包含与正则表达式的该部分匹配的任何内容:

   s/\(s[w|l].*[0-9].*\)\.\*'$/\1\\.*'/

由于您实际上只是在两个未更改的字符串之间插入反斜杠,因此您可以使用第二组括号,第二组使用 \2

   s/\(s[w|l].*[0-9].*\)\(\.\*'\)$/\1\\\2/

或者,您可以使用\zs\ze 来分隔要替换的字符串部分:

   s/s[w|l].*p0-9].*\zs\ze\*\'$/\\/

【讨论】:

  • 忘记捕获组,使用\zs!
  • 好建议,@PeterRincker。将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多