正则表达式匹配并拆分字符串的每三分之一

在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

我想在第三个实例中将:字符上的字符串分割开,以便可以生成另外三个字符串accountsgroupsnames 格式为:

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

之所以将它们存储在字符串而不是数组中,是为了实现跨环境的可移植性。

我可以使用sedcutawk这样的命令来实现此目的吗?

我用来捕获帐户的当前正则表达式为:

[a-zA-Z][0-9]+(?:([a-zA-z]*[0-9]*)*)(?:([a-zA-Z]*[0-9]*)*)

但是我觉得还有一种更有效的选择。

我尝试使用this solutionthis solution的组合来实现所需的输出,但是第一个缺少我需要的重复,而后者则是用于文件操作而不是字符串。

wyd379299458 回答:正则表达式匹配并拆分字符串的每三分之一

我将使用数组,并处理内容变量,就像从文件中读取行一样:

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值,则可以跳过将其存储在变量中的步骤,而直接读取文件即可。

本文链接:https://www.f2er.com/3158763.html

大家都在问