Как заставить «grep -P« foo (br) »» отображать только то, что в скобках? Мне нужен Perl?

2

У меня большой файл, и я пытаюсь получить из него все совпадения регулярного выражения.

grep -P "foo (b.r)"

Отображает все строки, содержащие «foo br», и я хотел бы отображать только то, что находится внутри скобок.

Вопрос про: что делать, если у меня более одного набора брекетов? Например, «foo (br) foo (.ar)», и я хочу, чтобы вывод состоял только из вещи в первой и второй скобках, разделенных разделителем.

Я помечаю этот Perl, потому что я уверен, что смогу использовать «perl -e" ... "» - вопрос экспертам Perl, как написать это? Прошло много лет с тех пор, как я использовал Perl :)

Колинько
источник

Ответы:

3

Возможно, используйте grep's -o

   -o, --only-matching
      Show only the part of a matching line that matches PATTERN.

который оставит вас с целым шаблоном, а затем последует другой sed (?), чтобы удалить / заменить разделители (foo)?

Я сомневаюсь, что это «эффективно», но это сделает работу.

PriceChild
источник
1
perl -ne '/foo \((.+?)\)/ and print "$1\n";'

Вот \( \)буквальные скобки и ( )создайте группу.

Если строка может совпадать несколько раз, это должно работать:

perl -ne 'print "$1\n" for /foo \((.+?)\)/g;'

Расшифровка однострочников:

  • a and bif (a) {b}
  • b if aif (a) {b}
  • b for afor (a) {b}
grawity
источник