Вы можете найти и перехватить любые 1+ символов, кроме @
, перед @
символом, затем сопоставить @
и любые 0+ символов, кроме пробелов, с последующими 0+ символами пробелов, и заменить все эти символы назаполнитель для группы 1 и запятая.Затем вам придется удалить запятую.
См. sed demo :
s='foo@some_text/48183 bar@another-test/22787 xyz@some_another_text/2291'
echo "$s" | sed -E 's/([^@]+)@[^[:space:]]*[[:space:]]*/\1,/g' | sed 's/,$//'
Обратите внимание, что вы также можете использовать sed 's/\([^@][^@]*\)@[^[:space:]]*[[:space:]]*/\1,/g'
вставку из POSIX.ERE версия.В BRE POSIX вы должны экранировать (
и )
, чтобы сформировать группу захвата, а квантификатор +
должен быть экранирован или заменен конструкцией aa*
.
Подробности
([^@]+)
- Группа захвата 1: 1+ символов, отличных от @
@
- @
char [^[:space:]]*
- 0+ символов, отличных от пробелов [[:space:]]*
- 0+ символов пробелов
\1
- это заполнитель для текста, захваченного группой захвата # 1.
Второй sed 's/,$//'
используется для удаления конечного ,
в конце строки.