在单词周围添加引号和逗号的vim命令

8

我有一份货币列表,包括它们的缩写和全称:

AED United Arab Emirates dirham
AFN Afghani
ALL Lek
AMD Armenian Dram
ANG Netherlands Antillian Guilder
AOA Kwanza
ARS Argentine Peso
AUD Australian Dollar
AWG Aruban Guilder
AZN Azerbaijanian Manat
BAM Convertible Marks
BBD Barbados Dollar
BDT Bangladeshi Taka
BGN Bulgarian Lev

我实际上有182行这样的文本……在notepad++中,我可以轻松地在几秒钟内为每个单词加上引号,并在每个单词后面加上逗号。我想知道是否有一种方法可以在vim或任何其他Linux编辑器中完成这项工作。

虽然我已经在notepad++中完成了这项工作,但拓宽自己到其他编辑器也是不错的选择。

欢迎提出建议。


你想引用单个单词还是货币缩写,然后将国家名称也用引号括起来,这些名称可能包含空格? - benjwadams
4个回答

14

在 ex 模式下尝试此命令。

%s/\w\+/"&",/g | $s/,$//

这应该能解决问题。

解释:

%s 是在所有行上进行替换。

在匹配部分中:

\w 是“单词字符”,不包括空格。

\+ 表示匹配一个或多个前面的字符。

在替换部分中:

& 指代整个匹配的字符串。

最后,g 表示全局替换该行中的所有匹配项,而不仅仅是在第一行停止替换。

竖线 | 可以用于分隔 Ex 命令并按顺序运行它们。

$s 意味着在最后一行进行替换。竖线后面的替换将删除该行末尾的任何逗号,这由锚点 $ 表示。这将确保列表末尾没有逗号。


4

您可以录制宏:

gg
qq
I"<Esc>
f<space>
s","<Esc>
A",<Esc>
q

并在每一行上执行它:

:%norm @q<CR>

或者一次性完成同样的事情:

:%norm I"<C-v><Esc>f<space>s","<C-v><Esc>A",<C-v><Esc><CR>

或者,当然可以使用替换:

:%s/\(\w\+\) \(.\+\)$/"\1","\2",

1
为了总结上述建议,您也可以选择可视块,并用引号括起来。这可能是最类似于NP ++的方法(即使我迄今为止从未使用过记事本!)。 可视块是使用ctrl-v选择的,因此我的解决方案是:
  • 转到第一行的开头:gg0
  • 选择第一个可视块:<ctrl-v>Ge
  • 用引号包围块:s""<esc>P
  • 跳转到空格并选择它们全部到底部:f<space><ctrl-v>G
  • 替换选定的空格:s,"
现在,为了完成这个过程,在每行末尾添加引号。您可以记录一个宏(请参见romainl的先前答案),或者--我更喜欢---执行快速替换:%s / $ /“/ g<enter>,然后完成了!

0

我知道这是一个老问题,但我想给出我的看法。

这是答案中最长的按键操作,但我认为这是最快捷、最自然的方法,至少对我来说是这样(这真的取决于你更熟悉什么以及你的思维方式)。

qq
cw"",<Esc>
h
h
p
W
C
""<Esc>
h
p
j
0
q

然后使用13@q运行宏以处理其余的行。

这是结果:

"AED", "United Arab Emirates dirham"
"AFN", "Afghani"
"ALL", "Lek"
"AMD", "Armenian Dram"
"ANG", "Netherlands Antillian Guilder"
"AOA", "Kwanza"
"ARS", "Argentine Peso"
"AUD", "Australian Dollar"
"AWG", "Aruban Guilder"
"AZN", "Azerbaijanian Manat"
"BAM", "Convertible Marks"
"BBD", "Barbados Dollar"
"BDT", "Bangladeshi Taka"
"BGN", "Bulgarian Lev"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接