【发布时间】:2017-09-25 02:45:22
【问题描述】:
我有一个这样格式的字符串:
"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>
我不知道如何使用 grep 或 sed 或 bash 正则表达式复制此功能。我已经尝试了一些类似的东西
echo "$email" | grep -oP "\"\K(.+?)(?=\")|'\K(.+?)(?=')|(\S+)"
这样做的问题是,虽然它有点模仿捕获组的功能,但它并不能真正适用于倍数,所以我得到像这样的捕获
"Mike
H<michael.haken@email1.com>"
michael.haken@email2.com
如果我删除向前/向后的逻辑,我至少会得到 3 个字符串,但第一个和最后一个仍然用引号引起来。在这种方法中,我将输出通过管道传输到read,这样我就可以将每个字符串单独添加到数组中,但我对其他选项持开放态度。
编辑:
我认为我的输入示例可能令人困惑,这只是一个可能的输入。真正的输入可以是任意数量的任意顺序的双引号、单引号或不带引号(不带空格)的字符串。我提供的 Javascript/C# 正则表达式是我想要实现的真实行为。
【问题讨论】:
-
请发布所需的输出。
-
问题已更新为所需的输出。
-
按照惯例,不要在 Bash 变量中使用大写字母,而是在引号中引用它们。