我的文字中有(i,1)
和(i,2)
等字符串。
我想搜索并替换它们以便我得到
分别为(1,i)
和(2,i)
。我如何在Vim中解决这个问题?
答案 0 :(得分:4)
:%s/(\([^,]\+\),\([^)]\+\))/(\2,\1)/g
说明:
:
让您进入命令模式%
将以下命令应用于每一行s
命令是替换。它由两部分组成,模式和替换。这些是
由/
/
模式的分隔符。模式是(\([^,]\+\),\([^)]\))
(
您想要匹配一个开头的paranthesis \(
将以下匹配部分存储在\1
。[^,]
匹配除{/ em> ,
\+
匹配至少一个(不是,
)\)
结束\1
,
匹配逗号(不要存储在任何地方)\(
与上述相同,但存储在\2
[^)]
匹配除{/ em> )
\+
匹配至少一个(不是)
)\)
如上所述)
匹配关闭的paranthesis(不要存储在任何地方)/
替换的分隔符。替换为(\2,\1)
(
文字插入(
\2
插入 pattern ,
插入文字,
\1
插入 pattern )
插入文字)
/
分隔符表示替换的结束。g
以便在一行上多次替换模式(仅当行包含(bbb,ccc)多次时才需要)答案 1 :(得分:2)
这个命令可以做到:
%s/(\zs\([^,]*\),\([^)]*\)\ze)/\2,\1/g
或
%s/\v\(([^,]*),([^)]*)\)/(\2,\1)/g
简要说明:
\v : very magic, to save some escapes
\( : match openning "("
([^,]*) : group 1 the text between "(" and ","
, : the comma
([^)]*) : group2 , the text between the "," and ")"
\) : ending ")"
替换部分:(\2,\1)
(交换两组)
答案 2 :(得分:2)
如果您想要一个明智的选择,请选择一个宏(:help q
)而不是搜索和替换(:help :s
)。如果搜索和替换模式变得复杂(例如,它们需要花费超过一两分钟的时间来编写),我经常会选择宏。宏非常简单直观,您只需执行一次更改即可重复执行。使用宏解决您的问题:
qq/(i,[12])<CR><SPACE>xpxp<BACKSPACE><BACKSPACE>xpq1000@q
这是29次非常简单的击键。
qq Record following keystrokes in register q
/(i,[12])<CR> Search for (i,1) or (i,2)
<SPACE>xpxp... Your text manipulation
q Stop recording
1000@q Replay contents from register q 1000x
不要担心,如果其中一个命令失败(在这种情况下搜索(i,1)
)重复立即停止。当然你也可以安全的方式做到:
@q Replay the keystrokes from register q (once)
@@ Repeat the last replay (that's easier than @q)
因此,您需要输入@q@@@@@@@@
之类的内容进行更改并进行检查。