Vim搜索和替换:改变字符的位置

时间:2014-02-27 14:08:14

标签: vim replace

我的文字中有(i,1)(i,2)等字符串。

我想搜索并替换它们以便我得到 分别为(1,i)(2,i)。我如何在Vim中解决这个问题?

3 个答案:

答案 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@@@@@@@@之类的内容进行更改并进行检查。