Linux Vim搜索和回复

Linux Vim搜索和回复,linux,vim,Linux,Vim,我想从name_jokl_nbfg搜索到.Q(Q_name)。在匹配模式中,我希望将.Q(Q_名称)替换为.Q(Q_名称),其他所有内容都应保持不变 ANDLVT name_jokl_nbfg( .D(NET_1), .S(SE_NAME), .Q(Q_NAME), .SN(SN_NAME)); 编辑: name_jokl_nbfg是不同的长实例名称中的常见字符串。在仅包含NAME_jokl_nbfg的实例中,我想将Q_N

我想从name_jokl_nbfg搜索到.Q(Q_name)。在匹配模式中,我希望将.Q(Q_名称)替换为.Q(Q_名称),其他所有内容都应保持不变

ANDLVT name_jokl_nbfg( .D(NET_1),
            .S(SE_NAME),
            .Q(Q_NAME),
            .SN(SN_NAME));
编辑:
name_jokl_nbfg是不同的长实例名称中的常见字符串。在仅包含NAME_jokl_nbfg的实例中,我想将Q_NAME替换为Q_NAME_NAME。Q_名称也出现在许多其他实例中。.Q(Q_名称)不需要仅出现在第三行中。它也可以出现在第二行或第四行。

您可以直观地选择要搜索/替换的范围,然后键入


然后,Vim将添加
”这将仅当Q_NAME出现在NAME_jokl_nbfg块中时,才将Q_NAME替换为Q_NAME。逻辑是描述整个多行块,同时将部分保存到记忆的组中,并将它们与新文本一起放回原位

:%s/^\(.* name_jokl_nbfg\_.\{-}\.Q(\)\(Q_NAME\)\(\_.\{-}));\)/\1Q_NAME_NAME\3/g
解释:

:%s/   In command mode, search on every line for
^      Anchor to start of line
\(     Start first group 
.*     any number of any characters
<sp>name_jokl_nbfg    Literal string followed by
\_.    Any character including a newline
\{-}   Non-greedy version of '*' so any number of any characters including newline until...
\.Q(   Literal string
\)     End first group
\(Q_NAME\)   Second group is the literal string you want to replace
\(     Start of group 3
\_.\{-}   any number of any characters non-greedy until...
));    literal string representing the end of the block
\)     End of group 3
/      Replace all that with
\1     remembered group 1
Q_NAME_NAME  Literal string
\3     remembered group 3
/g     do that globally (omit the g if you only need to replace the first occurrence)
:%s/在命令模式下,每行搜索
^起锚
\(开始第一组
*任意数量的任意字符
name_jokl_nbfg文本字符串后跟
\_.任何字符,包括换行符
\{-}非贪婪版本的“*”,所以任何数量的字符,包括换行符,直到。。。
\.Q(文本字符串)
\)第一组结束
\(Q_NAME\)第二个组是要替换的文本字符串
\(第3组开始)
\_.\{-}任意数量的非贪婪字符,直到。。。
));    表示块结尾的文本字符串
\)第3组结束
/换成
\第一组
Q_NAME_NAME文字字符串
\第三组
/g全局执行该操作(如果只需要替换第一个匹配项,则省略g)

:%s/.Q(Q\u NAME)/.Q(Q\u NAME\u NAME)我不清楚你为什么强调。。。直到…
?是否仅重新连接名为
name\u jokl\u nbfg
的单元格的
Q
pin?很可能不是OP想要的,但这没有错。我不理解否决票。我想从name.*.Q(Q_name)开始匹配,并用name.*.Q(Q_name_name)替换所有内容。Q(Q_name_name),我需要从name开始匹配,因为它会随着实例的变化而变化。@pradeep,你能添加一个before和after的示例,让你的问题更清楚。@pradeep-最好添加几个示例。
Q_NAME
是否总是低两行?它是否可以与
name\u jokl\u nbfg
在同一行?为什么不只搜索
Q(Q_NAME)
:%s/   In command mode, search on every line for
^      Anchor to start of line
\(     Start first group 
.*     any number of any characters
<sp>name_jokl_nbfg    Literal string followed by
\_.    Any character including a newline
\{-}   Non-greedy version of '*' so any number of any characters including newline until...
\.Q(   Literal string
\)     End first group
\(Q_NAME\)   Second group is the literal string you want to replace
\(     Start of group 3
\_.\{-}   any number of any characters non-greedy until...
));    literal string representing the end of the block
\)     End of group 3
/      Replace all that with
\1     remembered group 1
Q_NAME_NAME  Literal string
\3     remembered group 3
/g     do that globally (omit the g if you only need to replace the first occurrence)