3

我有几行文本,都具有相同的结构,并且想在所有行上排列 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/

我哪里做错了 ?

4

3 回答 3

5

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

你的目标是交换13周围2

(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`
于 2012-10-02T21:35:32.707 回答
1

我会做的

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

尚未检查任何其他答案

非贪心匹配 ( {-}) 是这里的关键

于 2012-10-02T21:39:17.793 回答
1
:%s/^\(\d\{7\}\)\(.*\) \(#.*\)/\3\2 \1/

可能对你有用。

于 2012-10-02T20:34:33.997 回答