Linux - только найти шаблон внутри строки, а не всю строку

Я хочу использовать регулярное выражение для поиска шаблона в файле. Этот шаблон может находиться в середине строки, но мне не нужна вся строка. Я попробовал grep -a pattern file, но это возвращает всю строку, содержащую регулярное выражение. Ниже приведен пример того, что я пытаюсь сделать. Кто-нибудь знает способ сделать это?

Пример:

Вход: AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC

Regex: Xx.*yY

Вывод: XxXxXxXxBananasyYyYyYyY

Ответ 1

вы были близки, вам нужен флаг -o

grep -o 'Xx.*yY' <<<AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC
XxXxXxXxBananasyYyYyYyY

Ответ 2

Используйте параметр -o для печати только той части строки, которая соответствует регулярному выражению

grep -o pattern file

Ответ 3

В дополнение к grep -o (самый простой способ) есть несколько других опций:

  • В bash, не полагаясь на какую-либо конкретную реализацию grep:

    $ regex='Xx.*yY'
    $ [[ AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC =~ $regex ]]
    $ echo ${BASH_REMATCH[0]}
    XxXxXxXxBananasyYyYyYyY
    
  • Использование expr, которое немного громоздко (частично потому, что регулярное выражение неявно привязано к началу строки), но определено стандартом POSIX, поэтому оно должно работать на любой платформе POSIX, независимо от используемой оболочки.

    $ expr AAAAAAAAAAAAAXxXxXxXxBananasyYyYyYyYBBBBBBBCCCCCC : '[^X]*\(Xx.*yY\)'
    XxXxXxXxBananasyYyYyYyY