Во-первых, вы не можете использовать сокращение "Perl -style", такое как \d
и \s
в Bash. Ваша последняя попытка близка, но содержит несколько ошибок, таких как [[a-zA-Z0-9]]
(должна быть только одна пара []
) и *{1,}
(не на 100% ясно, что это делает, но это не то, что вы хотите!).
Этот шаблон можно использовать вместо:
regex='([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9]+): (.*)'
Я использую [0-9]
для сопоставления цифр - вы можете использовать [[:digit:]]
вместо этого, но это не похоже на то, что вам нужна поддержка для любых символов вне диапазона 0-9
. Я также заменил \s
на простой пробел (вы можете использовать [[:blank:]]
для сопоставления пробелов или табуляции, если это возможно).
Что касается якорей ^
и $
, они, вероятно, вам не нужны:
^
необходимо только в том случае, если вы хотите избежать линий, которые соответствуют шаблону но не начинайте с него (похоже, все ваши строки начинаются с него, и в этом случае это не понадобится) $
не имеет значения, так как ваш шаблон заканчивается .*
, который будет занимать весь остаток строки
Тестирование:
$ line='2020-03-06 10:00:07 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...'
$ regex='([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9]+): (.*)'
$ [[ $line =~ $regex ]] && echo yes
yes
$ printf '%s\n' "${BASH_REMATCH[@]}"
2020-03-06 10:00:07 Test2: <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...
2020-03-06
10:00:07
Test2
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soape...