嗨:我正在尝试使用搜索/替换在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行的每次出现','?
谢谢!
答案 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
以进行就地编辑