vim:不同线路的多个条件

vim:不同线路的多个条件,vim,Vim,当几个条件仅匹配时,是否有任何方法可以在线上执行操作。 对于exmaple,我的文本如下 This is a blue coat This is a red coat This is a purple coat That is a coat (附言:本文是从另一个类似问题中借用的。) 如果当前行与^This匹配,而下一行与red匹配,则执行常规命令添加一些文本{Esc} 有一种简单的方法可以实现这一点,如: :%s/^This.*\ze\n.*red/&some text to be

当几个条件仅匹配时,是否有任何方法可以在线上执行操作。 对于exmaple,我的文本如下

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat
(附言:本文是从另一个类似问题中借用的。) 如果当前行与
^This
匹配,而下一行与
red
匹配,则执行常规命令
添加一些文本{Esc}

有一种简单的方法可以实现这一点,如:

:%s/^This.*\ze\n.*red/&some text to be appended/e
然而,当条件增加时,正则表达式繁荣起来。此外,这个解决方案并不像我预期的那么优雅。 是否仍然需要使用
:gloabl
命令来完成

在给出了一些答案之后,我发现我的问题不够清楚,因此我附加了下面的伪命令来显示我在寻找什么。 对我来说,实现这一点的优雅方式如下(但以下代码不起作用):

问题是,第一个
:g
命令不会传递行,但不会阻塞(我不确定是否正确),因此它不太可能过滤偏置条件(
red
,后面一行)

如果存在解决方案,我可以轻松处理以下操作: 如果“该行包含<代码>此且100行之后包含<代码>红色”,则打印“该行和以下三行”


我希望我已经说清楚了。

我会使用
\v
,意思是“非常神奇的搜索”,因此您可以使用如下正则表达式组:

/\v(red|blue|purple)
:g/^This.*\ze\n.*red/normal jAsome text to be appended

然后您的正则表达式将匹配上述每个选项。最好向我们显示所需的输出,这样我们可以更好地理解您想要的结果。

如果我理解正确,您希望在每个匹配的第一行末尾追加文本,但不要使用
:subst
命令

:global
:normal
将帮助您实现:

:g/^This.*\ze\n.*red/normal Asome text to be appended
如果要附加到第二行,只需添加“j”,如下所示:

/\v(red|blue|purple)
:g/^This.*\ze\n.*red/normal jAsome text to be appended

最后,我通过编写脚本解决了这个问题。我将代码推送到github,以防其他人需要它。 请参阅。 有关要求:

  • 电流包含
    [a-z]
  • 包含
    \d
    后的3行
  • 前2行包含
    示例
  • 在前面的行中追加
    一些文本
    ; 将是一个简单的ex命令:

  • 还有一个例子: 有关要求:

  • 当前包含要删除的
    
    
  • 下一行与
    ^$
    不匹配
  • 删除当前行 简单的做法是:

    :G/to delete/+!/^$/d
    

    我希望这会有所帮助。

    “当条件增加时,正则表达式繁荣起来”,这取决于条件是什么。。。你有什么想法?如果您举一个例子,说明使用正则表达式实际上是不切实际的,那么您的问题会更好:“是否需要使用:全局命令来完成?”是的<代码>:g/^This.*\n.*红色/正常!a要追加的部分文本
  • 将在与正则表达式匹配的行上追加文本。感谢大家的评论,我已重新编辑了问题,请参考。感谢帮助,问题已重新编辑。有关更清晰的解释,请参考更新的声明。感谢您的回答,但你的意思不是我想说的。