2

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

我想用键/值对组合创建 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/

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

谢谢

4

3 回答 3

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
于 2013-10-08T21:23:06.790 回答
4

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

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

于 2013-10-08T20:17:11.843 回答
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上阅读更多内容

于 2013-10-08T20:15:17.177 回答