Регулярное выражение sed не дает мне ожидаемого результата

#regex #bash #ubuntu #sed #command-line-interface

Вопрос:

Sed не дает мне ожидаемого результата. Я хочу получить вывод из группы 2, но sed мне ничего не дает. Я запустил эту команду Ubuntu 20.04.3 LTS и использовал sed (GNU sed) 4.7 . Но когда я попробовал его regex101.com , это дало мне ожидаемый результат. Вы можете увидеть это здесь.

 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: 1nGroup2: 2nGroup3: 3/"
Group1: https://
Group2:
Group3: one-two-three-four-five.dev.domain.com
root@6ab6c9bc0d76:~#
 

Ответ №1:

С вашим GNU sed вы можете использовать

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

Вывод:

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

Смотрите онлайн-демонстрацию.

Внутри выражения в скобках w анализируется как обратная косая черта или w соответствующий шаблон. [:alnum:] Класс символов POSIX соответствует цифрам или буквам, поэтому, поскольку w он также соответствует символам подчеркивания, вам нужно объединить [:alnum:] и _ внутри выражения в скобках, чем также соответствует - символу: [[:alnum:]_-] . Обратите - внимание, что оно должно быть расположено в начале / конце выражения в скобках.

Я использовал ~ в качестве разделителя регулярных выражений символ char, поскольку у вас есть / символы в шаблоне регулярных выражений, это помогает избежать чрезмерного экранирования.