2

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

grep -P "foo (b.r)"

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

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

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

2 ответа2

3

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

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

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

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

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}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .