В основном я хочу разобрать записи журнала в следующем формате:
a1 b2 c3) @ in # (d4 e5 f6) @ out # (g7 h8 i9
)@in#(
- это первый разделитель между двумя предыдущими подстроками (a1 b2 c3
и d4 e5 f6
). )@out#(
является необязательным разделителем для g7 h8 i9
. - Существует один или два пробела вокруг разделителя.
Интересно, что оба разделителя содержат несколько символов.
Я хочу использовать get все подстроки, используя Bash регулярное выражение . Это мой текущий код:
s1='a1 b2 c3 )@in#( d4 e5 f6 )@out#( g7 h8 i9'
s2='a1 b2 c3 )@in#( d4 e5 f6'
regex='^(.*)[[:space:]]+\)@in#\([[:space:]]+(.*)[[:space:]]+\)@out#\([[:space:]](.*)$'
[[ $s =~ $regex ]] && printf '%s\n%s\n%s\n%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}
Код соответствует только s1, но не s2Вот почему я пишу этот пост для вашей помощи.
Кстати, кто-нибудь может немного уточнить разницу между [[:space:]]
и \s
.
Обновление: изкомментарии и ответы, приведенные ниже, возможно, здесь не подходит регулярное выражение Bash. awk
лучше, чем.
Вместо того, чтобы просто печатать вывод,Я хочу записать их в переменные или read
в массив для дальнейшего процесса.