VIM - 用于替换/复制行的疯狂命令

时间:2013-10-08 20:09:35

标签: vim replace duplicates preg-replace

我有一个巨大的文件我需要更新才能创建一个列表(列出一个csv),但我只有一列。

我想用键/值对组合创建2列。

我有例如:

Key 1 is NICE
Key 2 is good
Key 3 is Awesome

我需要:

key 1 is nice|Key 1 is NICE
key_2_is_good|key 2 is good
key_3_is_awesome|Key 3 is Awesome

所以第一个将全部用_而不是空格小写,第二个用普通字符串

我到目前为止:

:%s/^\(.*\)$/\1|\1/

哪个好,但我怎样才能将空间固定为_并且全部小写?

感谢

3 个答案:

答案 0 :(得分:5)

宏可以比替换更直观:

qq                                      " start recording in register q then…
0                                       " go to the first column then…
y$                                      " yank from here to end of line then…
A|                                      " append a pipe at the end of the line then…
<C-r>=substitute(@", " ", "_", "g")<CR> " insert text of first column with spaces replaced by underscores then…
<Esc>                                   " get out of insert mode then…
q                                       " stop recording

之后,选择下一行并执行

:'<,'>norm @q

答案 1 :(得分:4)

在这种情况下,您可以使用替换的第二部分作为表达式进行评估,如下面:h sub-replace-special中的帮助中所述。

如果我已正确理解您的问题,这应该有效: %s/.*/\=substitute(tolower(submatch(0)), ' ', '_', 'g')."|".submatch(0) submatch(0)返回:s命令中完整匹配的文本,tolower()函数将其转换为小写,最后substitute()调用将所有空格替换为_ < / p>

答案 2 :(得分:2)

首先尝试一下:

:%s/^\(.*\)$/\L&\E|&/

输出:

key 1 is nice|Key 1 is NICE
key 2 is good|Key 2 is good
key 3 is awesome|Key 3 is Awesome

vim.wikia

了解详情