正则表达式 sed 没有给我预期的结果

Regex sed does not give me expected result

Sed 没有给我预期的结果。我想获得第 2 组的输出,但 sed 什么也没给我。我 运行 在 Ubuntu 20.04.3 LTS 上执行此命令并且我正在使用 sed (GNU sed) 4.7。但是当我在 regex101.com 上尝试时,它给了我预期的结果。可以看到here.

root@6ab6c9bc0d76:~# cat /etc/issue
Ubuntu 20.04.3 LTS \n \l
root@6ab6c9bc0d76:~# sed --version
sed (GNU sed) 4.7
Packaged by Debian
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
Paolo Bonzini, Jim Meyering, and Assaf Gordon.
GNU sed home page: <https://www.gnu.org/software/sed/>.
General help using GNU software: <https://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.

组 2 为空。

root@6ab6c9bc0d76:~# echo "https://one-two-three-four-five.dev.domain.com" | sed -E "s/(https?:\/\/)([\w|-]*)(.*)/Group1: \nGroup2: \nGroup3: /"
Group1: https://
Group2:
Group3: one-two-three-four-five.dev.domain.com
root@6ab6c9bc0d76:~#

使用 GNU sed,您可以使用

#!/bin/bash
echo "https://one-two-three-four-five.dev.domain.com" | \
 sed -E "s~(https?://)([[:alnum:]_-]*)(.*)~Group1: \nGroup2: \nGroup3: ~"

输出:

Group1: https://
Group2: one-two-three-four-five
Group3: .dev.domain.com

参见online demo

在方括号表达式中,\w 被解析为反斜杠或 w 匹配模式。 [:alnum:] POSIX 字符 class 匹配数字或字母,所以,由于 \w 也匹配下划线,需要将里面的 [:alnum:]_ 组合起来括号表达式也匹配 - 字符:[[:alnum:]_-]。请注意 - 必须位于括号表达式的 start/end 处。

我使用 ~ 作为正则表达式分隔符字符,因为正则表达式模式中有 / 个字符,这有助于避免过度转义。