Решение
grep
(на мой взгляд, это наиболее естественный подход, поскольку вы пытаетесь найти совпадения только с регулярным выражением - вы не хотите редактировать что-либо, поэтому не должно быть требуется более продвинутая команда sed
)
grep -oP '^[^-]*-\K[^-]*(?=-)' << EOF
> abc-qrs-bobo-the-clown
> 123-45-6789
> blah-blah-blah
> no dashes here
> mahi-mahi
> EOF
Вывод
qrs
45
blah
Пояснение
Посмотрите на сначала входные данные, включенные сюда для полноты как heredo c (более вероятно, что вы назвали бы свой файл последним аргументом grep
.) Решение требует наличия как минимум двух тире в строка; в частности, для mahi-mahi
совпадений не будет. Если вы хотите найти второй mahi
как совпадение, вы можете удалить утверждение опережающего просмотра в конце регулярного выражения (см. Ниже).
Регулярное выражение делает это. Сначала обратите внимание на параметры команды: -o
, чтобы вернуть только совпавшую подстроку, а не всю строку; и -P
для использования расширений Perl. Затем регулярное выражение: начать с начала строки (^
); ищите ноль или более не-da sh символов, за которыми следует da sh, а затем (\K
) отбрасывайте эту часть требуемого совпадения из подстрок, найденных для соответствия шаблону. Затем снова найдите ноль или более символов, отличных от sh - это будет возвращено командой. Наконец, потребуйте da sh, следующего за этим шаблоном, но не включайте его в соответствие. Это делается с помощью опережающего просмотра (отмеченного (?= ... )
).