正则表达式匹配 Vim 中行的开头和结尾(引用整行)

use*_*828 5 vim text-processing regular-expression

对于具有像此示例这样的行的初始文件:

1
12
123
1234
12345
Run Code Online (Sandbox Code Playgroud)

文件的期望状态是

'1'
'12'
'123'
'1234'
'12345'
Run Code Online (Sandbox Code Playgroud)

我已经有两个命令这样做,:%s/^/'/g而且:%s/$/'/g,我想进入一个。但是,当我尝试

:%s/[$^]/'/g
Run Code Online (Sandbox Code Playgroud)

我收到错误

E486: Pattern not found: [$^]
Run Code Online (Sandbox Code Playgroud)

我知道^括号中的领先意味着排除,所以我认为$首先意味着匹配行的开头和结尾,这显然不会发生。

如何在vim中匹配行的开头和结尾?

Dop*_*oti 6

怎么样:

:%s/.*/'&'/
Run Code Online (Sandbox Code Playgroud)

“用单引号前后的字符替换零个或多个字符”。


mur*_*uru 5

^并且$不要将这些含义(行的开头或结尾)保留在 内[ ],它用于选择一组字符。在 内部[ ],大多数正则表达式运算符失去了它们的含义(并且某些字符获得了特殊含义,或者获得了不同的含义)。前导^意味着[]该组被否定 - 匹配除这些字符之外的所有字符。因此[^$]可以匹配除 之外的任何字符$。(并且[$^]仅匹配$^字符。)

如果你想匹配行的开头结尾,请使用/^\|$/, where |is or(需要在 Vim 的默认正则表达式模式下转义)。

所以:

:%s/^\|$/'/g
Run Code Online (Sandbox Code Playgroud)

之所以g需要 ,是因为^$是两个独立的匹配项,并且s默认情况下仅作用于一行中的第一个匹配项。