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

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

对于包含如下示例行的初始文件:

1
12
123
1234
12345

文件所需的状态是

'1'
'12'
'123'
'1234'
'12345'

我一直使用两个命令来完成此操作,:%s/^/'/g并且:%s/$/'/g我想使用一个命令。然而,当我尝试

:%s/[$^]/'/g

我收到错误

E486: Pattern not found: [$^]

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

vim 中如何匹配行首和行尾?

答案1

怎么样:

:%s/.*/'&'/

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

答案2

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

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

所以:

:%s/^\|$/'/g

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

答案3

如果您可以贪婪地匹配整个内容,那么您实际上不需要匹配行的开头和结尾:

:%s/\(.*\)/'\1'/

主要要知道的是转义括号以创建“捕获组”,然后用于\1引用捕获的内容。

答案4

使用norm[al]命令和A附加控制,I预先控制我们使:exe[cute]命令执行第二个前置“规范”,因为默认情况下:norm[al]命令后面不能跟有:help :normal文档中的另一个命令。

所以命令如下:

:exe "%norm A'" |%norm I'

请注意,%此处对所有行执行更改。

相关内容