我想知道如何使用字符串在VIM中移动Columns / Text。我有一个简短的名单,我必须重新排序,需要放在姓氏第一中间到第一中间最后。
所以这里是一个示例列表:
我在想字符串应该是这样的:
:s/\([A-z]\{2}\)\(\[A-z]\{2}\)/2\1/
由于
答案 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上还有许多非常相似的正则表达式问题。