簡體   English   中英

Vim:用同一行中的另一個正則表達式匹配替換一行中的正則表達式匹配

[英]Vim: Replace regular expression match on a line with another regular expression match from same line

嗨:我正在嘗試使用搜索/替換來“旋轉” 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替換每次出現的','?

謝謝!

您試圖一次做太多事情,但是如果您堅持使用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

我想宏或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進行就地編輯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM