gpt4 book ai didi

regex - Bash 正则表达式捕获组

转载 作者:行者123 更新时间:2023-11-29 09:42:17 25 4
gpt4 key购买 nike

我有一个字符串是这种格式:

"Mike H<michael.haken@email1.com>" michael.haken@email2.com "Mike H<hakenmt@email1.com>"

如果我用 JS、C# 等编写一个普通的正则表达式,我会这样做

(?:"(.+?)"|'(.+?)'|(\S+))

并迭代匹配组以获取每个字符串,最好不带引号。我最终想将每个值添加到数组中,因此在示例中,我最终在数组中得到 3 个项目,如下所示:

Mike H<michael.haken@email1.com>
michael.haken@email2.com
Mike H<hakenmt@email1.com>

我不知道如何使用 grepsed 或 bash 正则表达式来复制此功能。我试过一些东西,比如

echo "$email" | grep -oP "\"\K(.+?)(?=\")|'\K(.+?)(?=')|(\S+)"

这个问题是虽然它有点模仿捕获组的功能,但它并不真正适用于倍数,所以我得到像这样的捕获

"Mike
H<michael.haken@email1.com>"
michael.haken@email2.com

如果我删除前瞻/后视逻辑,我至少得到了 3 个字符串,但第一个和最后一个仍然用引号引起来。在这种方法中,我将输出通过管道传输到 read,这样我就可以将每个字符串单独添加到数组中,但我对其他选项持开放态度。

编辑:

我认为我的输入示例可能令人困惑,这只是一个可能的输入。实际输入可以是双引号、单引号或非引号(无空格)的字符串,以任意顺序任意数量。我提供的 Javascript/C# 正则表达式是我试图实现的真实行为。

最佳答案

您可以使用 Perl:

$ email='"Mike H<michael.haken@email1.com>" michael.haken@email2.com "Mike H<hakenmt@email1.com>"'
$ echo "$email" | perl -lane 'while (/"([^"]+)"|(\S+)/g) {print $1 ? $1 : $2}'
Mike H<michael.haken@email1.com>
michael.haken@email2.com
Mike H<hakenmt@email1.com>

或者在纯 Bash 中,它变得有点冗长:

re='\"([^\"]+)\"[[:space:]]*|([^[:space:]]+)[[:space:]]*'
while [[ $email =~ $re ]]; do
echo ${BASH_REMATCH[1]}${BASH_REMATCH[2]}
i=${#BASH_REMATCH}
email=${email:i}
done
# same output

关于regex - Bash 正则表达式捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com