在不使用 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 个以冒号分隔的字段创建捕获组,然后以与原来不同的顺序替换它们。
我有一个 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 个以冒号分隔的字段创建捕获组,然后以与原来不同的顺序替换它们。