Vim:将一行上的正则表达式匹配替换为来自同一行的另一个正则表达式匹配

时间:2016-09-02 00:08:34

标签: regex vim

嗨:我正在尝试使用搜索/替换在vim中'转移'某些值,但似乎卡住了。

考虑以下文件:

key1: value1, value2, value3, ... valueN\n
key2: valueA, valueB, valueC,...valueX\n
...

我正在尝试使用该行上的'key'转换每个',',后跟换行符。

因此,输出将是:

value1:key1\n
value2:key1\n
value3:key1\n
...
valueN:key1\n
valueA:key2\n
valueB:key2\n
...

我不确定如何用第一个匹配替换每次出现的正则表达式匹配(在本例中为',')。

我试过了:

:%s/\(^.\{-}\): \(.\{-}\),/\2:\1\r

但这只会替换第一次出现','。

如何使用\ 1替换EERY行的每次出现','?

谢谢!

2 个答案:

答案 0 :(得分:3)

你一次尝试做太多事情,但是如果你坚持的话可以用Vim完成:

:%s/\v\s*(\w+):\s*(.*)/\=substitute(submatch(2), '\v\s*%(,\s*|$)', ':' . submatch(1) . '\n', 'g')/

输入:

key1: value1, value2, value3
key2: valueA, valueB, valueC

输出:

value1:key1
value2:key1
value3:key1

valueA:key2
valueB:key2
valueC:key2

答案 1 :(得分:1)

我认为使用宏或vimscript是可能的,但如果perl解决方案对你没问题......

$ cat ip.txt 
key1: value1, value2, value3, valueN
key2: valueA, valueB, valueC, valueX

$ perl -pe 's/^([^:]+):\s*(.*)/$2/; $k=$1; s/(value\w+),?\s*/$1:$k\n/g' ip.txt 
value1:key1
value2:key1
value3:key1
valueN:key1
valueA:key2
valueB:key2
valueC:key2
valueX:key2

如果输出符合预期,请将perl -pe更改为perl -i -pe以进行就地编辑