我想知道如何使用字符串在 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 上也有很多非常相似的正则表达式问题。