我想知道如何使用字符串在 VIM 中移动列/文本。我有一个必须重新排序的名称的简短列表,需要将其放置在姓氏 First Middle 到 First Middle Last 中。
所以这里是一个示例列表:
- 工厂,罗伯特 A.
- 佩奇,吉米
- Bonhham,约翰 H.
- 琼斯,约翰·保罗
我在想字符串应该是这样的:
:s/\([A-z]\{2}\)\(\[A-z]\{2}\)/2\1/
谢谢
首先,我建议使用\v“非常神奇”标志来避免元字符的所有其他内部转义。这将与以下替代品一起使用:
:s/\v([A-z]+),\s+([A-z]+)(\s+[A-z.]+)?/\2\3 \1
分解它:
([A-z]+)将姓氏捕获到\1,\s+文字逗号和一个或多个空格([A-z]+)将名字捕获到\2(\s+[A-z.]+)?捕获中间名及其前导空格,因为它可能不存在。还允许., 并以 a 结尾?以使整个构造成为可选的\3\2\3 \1替换为第二组(名字),紧跟中间名\3,中间没有空格,因为空格与中间名一起被捕获。然后附加\1姓氏。如果名称可能超过[A-z]+,您也可以使用[\S]+来捕获所有非空白字符。
这个怎么样:
:%s/\([[:alpha:]]\+\), \([[:alpha:]]\+\)\( [[:alpha:]]\+\.\?\)\?/\2\3 \1/g
这将捕获最后一个、中间(可选)和第一个,并在替换中重新排序它们。您可能需要在[[:alpha:]]集合中包含其他字符,但这适用于您的示例。
欲了解更多信息,请了解优秀和综合:help是如何构建的;所有的信息都在那里(你只需要知道如何找到它)!Stack Overflow 上也有很多非常相似的正则表达式问题。