Как мне сопоставить внутренний шаблон несколько раз вместо похожих внешних шаблонов?

#linux

#linux

Вопрос:

Я хотел бы сопоставить внутренние шаблоны, которые являются подмножествами большего внешнего шаблона, используя egrep. Например:

 $ egrep 'b.*a' <<< baababaa
baababaa
  

Я хочу, чтобы это печатало:

 baa
ba
baa
  

Комментарии:

1. echo "baababaa" | sed 's/(.)b/1 b/g'

Ответ №1:

egrep на самом деле это не совсем подходящий инструмент для работы из-за grep ограничений, связанных с управлением выводом. Вместо этого sed могу предоставить именно то, что вам нужно, используя базовые регулярные выражения.

Например:

 $ echo "baababaa" | sed 's/(.)b/1 b/g'
baa ba baa
  

Объяснение

  • sed 's/find/replace/g' — общая форма замены sed с 'g' опцией, применяемой для того, чтобы сделать замены глобальными, где

Найти

  • '.' — сопоставьте любой одиночный символ и
  • (.) — захват одного символа между (...) ,
  • за которым следует 'b' ,

заменить

  • 1 вставьте обратную ссылку (символ, захваченный между (...) ),
  • за которым следует ' ' (пробел) и 'b' .

Более ограниченная форма, которая просто находит все внутренние "ab" и помещает пробел между ними, была бы:

 sed 's/ab/a b/g'
  

Просмотрите все и дайте мне знать, если у вас возникнут вопросы.