在Vim中,如何交换2个非相邻模式?

时间:2012-10-02 20:28:11

标签: regex vim

我有文本行,都具有相同的结构,并希望在所有行上排列2个元素:

1257654 some text (which may be long) #Foo
1543098 some other text #Barbar
1238769 whatever #Baz
2456874 something else #Quux

我想获得:

#Foo some text (which may be long) 1257654
#Barbar some other text 1543098
#Baz whatever 1238769
#Quux something else 2456874

这是我被困的地方:

:%s/\(\d\{7\}\)\(#.\{-}\)/\2\1/

我哪里出错了?

3 个答案:

答案 0 :(得分:5)

替换的问题是你只有两组而不是三组。

您的目标是在1周围交换32

(1)(2)(3) --> (3)(2)(1)

所以你需要在你的模式中有三个小组:

(1543098)( some other text )(#Barbar)

能够做到:

(#Barbar)( some other text )(1543098)

这种替换似乎有效:

:s/^\(\d\{7\}\)\(.*\)\(#\w*\)/\3\2\1

这是一个更短更漂亮的版本,感谢verymagic

:s/\v^(\d{7})(.*)(#\w*)/\3\2\1`

答案 1 :(得分:1)

:%s/^\(\d\{7\}\)\(.*\) \(#.*\)/\3\2 \1/

可能会为你工作。

答案 2 :(得分:1)

我会这样做

%s/\v^(\d{7})(.{-})\s*(#.*)$/\3\2 \1/

尚未检查任何其他答案

非贪婪的匹配({-})是此处的关键