соответствие шаблону sed до первого совпадения - PullRequest
0 голосов
/ 17 декабря 2018

Я борюсь с регулярным выражением sed.Я посмотрел старые существующие темы по этой теме, но не смог найти решение, и я хотел бы избежать использования команды awk.

Я хочу захватить часть входной строки перед первой отметкой времени встрока.

Случай 1:

$ input_str=abc_123_def_20181217T2345
$ echo $input_str | sed 's/\(.*\)_\([0-9]\{8\}\).*/\1/'
$ abc_123_def

Случай 2:

$ input_str=abc_123_def_20181217T2345_20181218T2345
$ echo $input_str | sed 's/\(.*\)_\([0-9]\{8\}\).*/\1/'
$ abc_123_def_20181217T2345

Ожидаемый результат: abc_123_def

Как видно из случая 2,выражение sed также захватывает первую временную метку.Я понимаю, что .* будет максимально соответствовать, но как мне обойти это?

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете сопоставить первую отметку времени после _, а затем сопоставить все до конца строки, чтобы удалить совпадение:

sed 's/_[0-9]\{8\}.*//' <<< "$input_str"

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

Таким образом, вы используете тот факт, что механизм регулярных выражений ищет строку слева направо, и _[0-9]\{8\} будет совпадать с первым вхождением отметки времени слева .* будет соответствовать остальной части строки, и, поскольку это команда s, он удалит найденное совпадение, оставив вас с подстрокой до первого появления TIMESTAMP.

...