对于包含如下示例行的初始文件:
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'
请注意,%
此处对所有行执行更改。