在VIM中移动列/文本

时间:2013-10-06 19:10:28

标签: string vim text

我想知道如何使用字符串在VIM中移动Columns / Text。我有一个简短的名单,我必须重新排序,需要放在姓氏第一中间到第一中间最后。

所以这里是一个示例列表:

  • Plant,Robert A.
  • 佩吉,吉米
  • Bonhham,John H。
  • 琼斯,约翰保罗

我在想字符串应该是这样的:

:s/\([A-z]\{2}\)\(\[A-z]\{2}\)/2\1/

由于

2 个答案:

答案 0 :(得分:3)

首先,我建议using the \v "very magic" flag避免元字符的所有其他内部转义。这将适用于以下替换:

 :s/\v([A-z]+),\s+([A-z]+)(\s+[A-z.]+)?/\2\3 \1

打破它:

  • ([A-z]+)将姓氏记入\1
  • ,\s+一个文字逗号和一个或多个空格
  • ([A-z]+)将第一个名称捕获到\2
  • (\s+[A-z.]+)?使用其前导空格捕获中间名,因为它可能不存在。同时允许.,并以?结尾以使整个构造成为可选的\3
  • \2\3 \1替换为第二个组(名字),紧接着是中间名\3之间没有空格,因为空间是与中间名一起捕获的。然后在\1附加姓氏。

如果名称可能超过[A-z]+,您也可以使用[\S]+来捕获所有非空白字符。

答案 1 :(得分:0)

这个怎么样:

:%s/\([[:alpha:]]\+\), \([[:alpha:]]\+\)\( [[:alpha:]]\+\.\?\)\?/\2\3 \1/g

这会捕获最后,中间(可选)和第一个,并在替换中重新排序。您可能需要在[[:alpha:]]集合中包含其他字符,但这适用于您的示例。

有关详细信息,请了解优秀且全面的:help的结构;所有的信息都在那里(你只需要知道如何找到它)! Stack Overflow上还有许多非常相似的正则表达式问题。