2017-09-03 105 views
0

我需要在Vim中用替换\rdo。但是,如果在它之前存在Fortran注释符号!,即在搜索模式!.*;\s*\<do\>中,我还需要确保;\s*\<do\>不会被替换。例如,; do中注释掉线Vim替换特定条件

j=2; do i=1, 10 

应及时更换如下面的注释部分

j=2 
do i=1,10 

; do不应该被替换,

k=3 ! j=2; do i=1, 10 

我该怎么做在vim中?我试过\(!.*\)\@!;\s*\<do\>,它不起作用。

+1

你能发布一个示例输入文件和期望的输出吗? –

+0

我不认为你应该在这里问这个问题,超级用户可能是一个更好的地方 – Sinapse

+1

也有https://vi.stackexchange.com/但是vi(m)的问题总是被接受在SO ... –

回答

3

我编辑根据您例如这样的回答:

尝试使用:g!/<pattern1>/s/<pattern2>/<replacement>/g:仅在不包含pattern1线

:g!/!.*/s/\v;\s*do/\rdo/g 

这确实与replacement更换pattern2

原来的答复:

下面的模式应该做你要求:/[^*]\{0,1\}\zs;\\s\*\\<do\\>。 您可以使用它来替换它想要的任何东西,例如%s/<pattern>/\rdo/g

+0

请注意前导'/'是搜索命令,而不是实际正则表达式的一部分。 – avivr

+0

这不起作用。也许我不会恰当地说出我的问题。按'!。*; \ s * \ ',我的意思是搜索模式。查看更新的问题。 –

+0

对不起,在添加示例之前,您好像试图替换字面搜索模式。 – avivr

0
:v/!/ s/; /\r/g 

:v .......... global negation (all lines without pattern) 
/!/ .......... all lines not containing ! 
s ............ substitution 
; ............ semicolon space 
\r ........... Carriage return "Enter"