regex vim:选择性地替换文件中的括号

vddsk6oq  于 2023-01-06  发布在  其他
关注(0)|答案(4)|浏览(142)

我有以下文本文件:

A(B C)
D(E F)
A(G 
H 
I)

我想将其转换为:

modifiedA{B C}
D(E F)
modifiedA{G 
H
I}

通常,我会使用s/A(/modifiedA\{/gs/)/}/g
因为我不想用D(E F)接触这条线,所以这不起作用。
谢谢你的意见/帮助。
更新:
1.答案应该不需要人工干预,并且应该是可伸缩的,因此,使用c代替g不是一个选项。
1.还要注意,A()可以跨多行分布。

qkf9rpyu

qkf9rpyu1#

为了匹配多行模式,我们需要\_.\{-},这意味着非贪婪正则表达式搜索:

:%s/\(A\)(\(\_.\{-}\))/modified\1{\2}

\( ................ start of a regex group
\) ................ end of a regex group
\_.\{-} ........... non-greedy regex
\1 ................ back reference to the regex group 1

使用very magic option请参见:h \v

%s/\v(A)\((\w \_.{-})\)/modified\1{\2}
llew8vvj

llew8vvj2#

你可以通过录制和重放一个vim宏来实现:(例如,q):
记录:

qq/A(<Enter>%%r{``r}q

重播:

99@q

只要A的(...)配对良好,这个方法就可以工作,甚至在嵌套的情况下也可以工作:

wnavrhmk

wnavrhmk3#

  • 这是对第一个问题的回答 *

substitute命令支持用于确认的标志c

[c] Confirm each substitution.  Vim highlights the matching string (with
|hl-IncSearch|).  You can type:             *:s_c*
    'y'     to substitute this match
    'l'     to substitute this match and then quit ("last")
    'n'     to skip this match
    <Esc>   to quit substituting
    'a'     to substitute this and all remaining matches {not in Vi}
    'q'     to quit substituting {not in Vi}
    CTRL-E  to scroll the screen up {not in Vi, not available when
        compiled without the |+insert_expand| feature}
    CTRL-Y  to scroll the screen down {not in Vi, not available when
        compiled without the |+insert_expand| feature}
If the 'edcompatible' option is on, Vim remembers the [c] flag and
toggles it each time you use it, but resets it when you give a new
search pattern.
{not in Vi: highlighting of the match, other responses than 'y' or 'n'}

:help :s_flags
elcex8rz

elcex8rz4#

您可以使用以下命令:
第一个月
让我们来分析一下:

  • :s:substitute命令的缩写。
  • /:模式的开始。
  • \(A\):捕获第一个捕获组中的"A"。
  • (:文本"("
  • \(B C\):捕获第二个捕获组中的"B C"。
  • ):文字")"
  • /:模式结束。替换开始。
  • \1:对第一个捕获组("A")的反向引用。
  • {\2}:对第二个捕获组('B C')的反向引用,用大括号括起来。
  • /g:替换结束,标志"g"使每行应用多次替换。

这个"|命令之间的,使它们自动一个接一个执行。

  • 注意这个答案依赖于'A',' D '和' I '是字面量。否则它们可能包括以下括号中的文本。如果你正在处理更复杂的文本,我建议你做多个替换而不是一个命令。*

另请参见::help :|
:help pattern.txt
:help usr_27.txt

相关问题