正则表达式匹配和拆分字符串的每三次出现

Posted

技术标签:

【中文标题】正则表达式匹配和拆分字符串的每三次出现【英文标题】:Regex to match and split every third occurrence of a string 【发布时间】:2020-03-01 23:03:08 【问题描述】:

在 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 solution 和this solution 的组合来实现所需的输出,但是第一个缺少我需要的重复,而后者用于文件操作而不是字符串。

【问题讨论】:

您能显示您希望accountsgroupsnames 包含哪些值吗? @glennjackman 当然,我已经编辑了问题以进行澄清:) 【参考方案1】:

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

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

【讨论】:

这非常适合我需要在 AIX 环境中完成的工作,尽管此解决方案使用了我接受它的阵列,因为它也适用于我需要的 RHEL 环境。谢谢@glennjackman

以上是关于正则表达式匹配和拆分字符串的每三次出现的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式与集合

C# 正则表达式匹配与拆分相同的字符串

JS正则表达式从入门到入土—— 分组

正则与re模块

C# 正则表达式匹配案例 - 拆分字符串并写入文件输出

您可以在字符串拆分中使用零宽度匹配正则表达式吗?