在不使用 awk、read 等的情况下使用正则表达式交换 vi 中的列

Swapping columns in vi with regex without using awk, read, etc

我有一个 1000 行的文件,每行有 5 到 8 列,由 :

分隔
1:2:3:4:5:6:7:8

4g10:8s:45:9u5b:a:z1

我希望所有行都按某种顺序排列4:3:1:2:5:6:7...

如何使用正则表达式仅交换前 4 列?

这是一个正则表达式,可以满足您的需求:

newtext = re.sub("([^:]+):([^:]+):([^:]+):([^:]+)(:)?(.*)?",r":::",text)

要点是您需要使用 parans 进行捕获,然后按照您希望它们在替换中的顺序重新排序。每个捕获 "group" 只是一个或多个非 : 分隔: 如果有空组的可能性,请将每个 + 更改为 *

为清楚起见,这里是 Python 中的示例:

import re

textlist = [
"1:2:3:4:5:6:7:8",
"1:2:3:4:5",
"1:2:3:4",
]


for text in textlist:
    newtext = re.sub("([^:]+):([^:]+):([^:]+):([^:]+)(:)?(.*)?",r":::",text)
    print (newtext)

输出:

4:3:1:2:5:6:7:8
4:3:1:2:5
4:3:1:2

我认为这可能用另一种方法更容易做到,但您可以使用 ex 来做到这一点,所以在命令模式下输入:

:%s/^\([^:]\+\):\([^:]\+\):\([^:]\+\):\([^:]\+\):/::::/

这将为前 4 个以冒号分隔的字段创建捕获组,然后以与原来不同的顺序替换它们。