如何只在部分行而不是全部行上运行:substute?


15

我有这样一条线:

function my_function(argument, another argument, but there are spaces)

我想用下划线代替空格字符(在参数名称内)。因此,我想使用:

:s/\ /_/g

但是我如何选择不将其应用于整个行,而是从例如光标位置开始?(或第三个单词)?


4
在正则表达式中,可以使用atom来描述当前光标位置\%#。因此,您可以使用::s/\v(%#.*)@<= /_/g。可以将其描述为@<=光标位置后的()字符前面的空格。
user9433424'6

1
你们和Statox都提出了这个\%#窍门,如果您不写,我会接受他的回答。但是你们俩可以更明确地解释regexp吗?
Feffe

Answers:


15

您可以使用以下解决方案:

首先用于v$从光标到行尾选择文本。然后使用以下命令:

:s/\%V\ /_/g

\%V用于更改以前在视觉上选择的区域中的文本的指示,请参阅:h /\%V

以我为例:

function my_function(argument, another argument, but there are spaces)

如果我的光标在第40列上,并且使用我刚写的命令,我将得到:

function my_function(argument, another argument,_but_there_are_spaces)

在回答您的评论时,您也可以使用

  • \%# 从光标位置匹配
  • \%>23c 在第23列之后匹配。
  • \%>'m 在标记位置之后匹配

:h /\%#:h /\%>c:h /\%>'m

@ User9433424 \%#在他的评论中提供了一种使用方式。对于带有标记的图案,可以将其设置为机智ma,然后使用:

:s/\%>'a /_/g

@ User9433424给出的模式的解释如下:

:s/\v(%#.*)@<= /_/
:s/                    substitution command
   \v                  Enable the very magic mode
      %#.*             Any characters from the cursor position
           @<=         Check for matches just before what follows
              space    Followed by a space
               /_/     Substitute the matches by underscores

您将要看到:h \v:h /\@<=


它工作正常!但是我并不习惯视觉选择,整个过程似乎有点“繁重”……您认为可以更快地完成一些工作吗?
Feffe

是的,让我更新我的答案:)
statox

User9433424在您面前给出了此提示,但是您回答了,所以如果可以的话,我将接受您的回答-您能否解释一下他使用的正则表达式模式多一点?我仍然在为此而苦苦挣扎……
Feffe

我试图使答案尽可能清晰,但如果@ User9433424写下自己的答案,请毫不犹豫地接受它。
statox

1
正则表达式的很好的解释,谢谢!并感谢您对谁的回答表示欢迎:)
Feffe

5

您可以使用look back(:h \@<=)来确保前面有一个'(',以及一个字尾边界(:h \>)以确保替换发生在所需的位置。

所以,加上文字:

function my_function(argument, another argument, but there are spaces)

运行命令:

:s/\((.*\)\@<=\> /_/g

将产生:

function my_function(argument, another_argument, but_there_are_spaces)

如果替换操作始终具有已知的起点,则这可能比每次定位光标都容易。


2
替换并非总是有一个已知的起点:仅仅是为了...纠正我所做的一系列奇怪的错字。但是,您的答案仍然很有趣,谢谢!
Feffe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.