Почему это регулярное выражение не работает с grep?

У меня есть текстовый файл таким образом

"an arbitrary string" = "this is the text one"
"other arbitrary string" = "second text"
"a third arbitrary string" = "the text number three"

Я хочу получить только это

an arbitrary string
other arbitrary string
a third arbitrary string

То есть текст внутри первых котировок или между первым " и " =. Я использовал это регулярное выражение

(?!").*(?=(" =))

Это работает, когда я пробовал его в RegExr и в этом онлайн-инструменте. Но в моем OSX Terminal это не работает, выход пуст

grep -o '(?!").*(?=(" =))' input.txt

Что здесь не так? Должен ли я избегать некоторых персонажей? Я стараюсь всех и ничего не меняется.

Большое вам спасибо и, пожалуйста, извините за недостаток знаний об этой теме.

3 ответа

Lookaheads и lookbehind - это функции PCRE, поэтому вам нужно использовать параметр -P:

grep -Po '(?!").*(?=(" =))' input.txt


Ответ steffen прав, вы должны использовать флаг -P. Но есть и проблема с вашим регулярным выражением.

Представьте этот вход: "an arbitrary string" = " =this is the text one"

Ваше регулярное выражение не удастся резко. Чтобы решить эту проблему, вы должны использовать что-то вроде этого:

grep -Po '^"\K.*?(?=(" =))'

  • ^ чтобы предотвратить другие совпадения, которые не начинаются с начала строки.
  • \K просто легче читать. (Он также позволяет вам сопоставлять строки с произвольной длиной)
  • .*? чтобы сделать его неживым.


Это должно сделать:

awk -F\" '{print $2}' file

Он использует " как разделители", а затем печатает второе поле.

licensed under cc by-sa 3.0 with attribution.