Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Vim:将一行上的正则表达式匹配替换为同一行中的另一个正则表达式匹配_Regex_Vim - Fatal编程技术网

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

Regex Vim:将一行上的正则表达式匹配替换为同一行中的另一个正则表达式匹配,regex,vim,Regex,Vim,您好:我正在尝试使用搜索/替换“透视”vim中的一些值,但似乎被卡住了 考虑以下文件: key1: value1, value2, value3, ... valueN\n key2: valueA, valueB, valueC,...valueX\n ... 我试图转换每一个“,”和“键”在那一行,后面是一个换行符 因此,输出将是: value1:key1\n value2:key1\n value3:key1\n ... valueN:key1\n valueA:key2\n value

您好:我正在尝试使用搜索/替换“透视”vim中的一些值,但似乎被卡住了

考虑以下文件:

key1: value1, value2, value3, ... valueN\n
key2: valueA, valueB, valueC,...valueX\n
...
我试图转换每一个“,”和“键”在那一行,后面是一个换行符

因此,输出将是:

value1:key1\n
value2:key1\n
value3:key1\n
...
valueN:key1\n
valueA:key2\n
valueB:key2\n
...
我不知道如何用第一个匹配替换正则表达式匹配(','在本例中)

我试过:

:%s/\(^.\{-}\): \(.\{-}\),/\2:\1\r
但这只会替换第一次出现的“,”

如何将每行出现的“,”替换为\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
进行就地编辑我认为可以使用宏或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
进行就地编辑

您试图一次完成太多的事情,但如果您坚持以下要求,可以使用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

您试图一次做太多的事情,但如果您坚持,可以使用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

谢谢我可以用一种“语言”(perl/python…)完成这项工作,但我希望用vim以交互方式完成…@AaCc,所以Sato的答案应该是:)谢谢。我可以用一种“语言”(perl/python…)完成这项工作,但我希望用vim以交互方式完成…@AaCc,所以Sato的答案应该是:)谢谢!将深入研究替代和子匹配功能。非常有帮助,谢谢!将深入研究替代和子匹配功能。非常有用。