正则表达式匹配和拆分每三次出现的字符串
Regex to match and split every third occurrence of a string
在 Korn Shell 脚本中,我在字符串变量 contents
中有大量数据符合以下语法:
account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
...
account_id_N:group_id_N:name_N
我想每隔三个实例在 :
字符上拆分字符串,这样我就可以生成另外三个字符串 accounts
、groups
和 names
格式为:
accounts = account_id_0,account_id_1,...,account_id_N
groups = group_id_0,group_id_1,...,group_id_N
names = name_0,name_1,...,name_N
我想将它们存储在字符串而不是数组中的原因是为了跨环境的可移植性。
我可以使用 sed
、cut
或 awk
命令来实现吗?
我用来捕获帐户的当前正则表达式是:
[a-zA-Z][0-9]+(?:([a-zA-z]*[0-9]*)*)(?:([a-zA-Z]*[0-9]*)*)
但我觉得还有更有效的选择。
我尝试使用 this solution and this solution 的组合来实现所需的输出,但是第一个缺少我需要的重复,而后者用于文件操作而不是字符串。
我会使用数组,并像从文件中读取行一样处理内容变量:
contents='account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
...:...:...
account_id_N:group_id_N:name_N'
as=()
gs=()
ns=()
while IFS=: read -r a g n; do
as+=("$a")
gs+=("$g")
ns+=("$n")
done <<< "$contents"
accounts=$(IFS=,; echo "${as[*]}")
groups=$(IFS=,; echo "${gs[*]}")
names=$(IFS=,; echo "${ns[*]}")
printf "%s\n" "$accounts" "$groups" "$names"
account_id_0,account_id_1,...,account_id_N
group_id_0,group_id_1,...,group_id_N
name_0,name_1,...,name_N
如果您从文件中获取 contents
值,则可以跳过将其存储在变量中的步骤,直接读取文件即可。
在 Korn Shell 脚本中,我在字符串变量 contents
中有大量数据符合以下语法:
account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
...
account_id_N:group_id_N:name_N
我想每隔三个实例在 :
字符上拆分字符串,这样我就可以生成另外三个字符串 accounts
、groups
和 names
格式为:
accounts = account_id_0,account_id_1,...,account_id_N
groups = group_id_0,group_id_1,...,group_id_N
names = name_0,name_1,...,name_N
我想将它们存储在字符串而不是数组中的原因是为了跨环境的可移植性。
我可以使用 sed
、cut
或 awk
命令来实现吗?
我用来捕获帐户的当前正则表达式是:
[a-zA-Z][0-9]+(?:([a-zA-z]*[0-9]*)*)(?:([a-zA-Z]*[0-9]*)*)
但我觉得还有更有效的选择。
我尝试使用 this solution and this solution 的组合来实现所需的输出,但是第一个缺少我需要的重复,而后者用于文件操作而不是字符串。
我会使用数组,并像从文件中读取行一样处理内容变量:
contents='account_id_0:group_id_0:name_0
account_id_1:group_id_1:name_1
...:...:...
account_id_N:group_id_N:name_N'
as=()
gs=()
ns=()
while IFS=: read -r a g n; do
as+=("$a")
gs+=("$g")
ns+=("$n")
done <<< "$contents"
accounts=$(IFS=,; echo "${as[*]}")
groups=$(IFS=,; echo "${gs[*]}")
names=$(IFS=,; echo "${ns[*]}")
printf "%s\n" "$accounts" "$groups" "$names"
account_id_0,account_id_1,...,account_id_N
group_id_0,group_id_1,...,group_id_N
name_0,name_1,...,name_N
如果您从文件中获取 contents
值,则可以跳过将其存储在变量中的步骤,直接读取文件即可。