Grep (или, может быть, регулярное выражение) проверка шаблона в строках до или после матча - PullRequest
2 голосов
/ 14 июля 2009

У меня есть простая команда grep, которая возвращает строки, совпадающие с файлом. Вот проблема: иногда, когда строка соответствует, я хочу включить строку перед ней. Мне нужен способ найти все строки, которые соответствуют шаблону, а затем использовать другой шаблон, чтобы увидеть, совпадают ли строки перед каждым из этих результатов.

Допустим, я хочу получить все строки, содержащие 'bar', и строки перед каждой из них, только если они содержат 'foo'. С учетом ввода, как это:

    Spam spam eggs eggs
    Let's all go to the bar.
    Blah Blah Blah foo.
    Meh.
    foo foo foo
    Yippie, a bar.

Мне бы хотелось получить такой результат:

    Let's all go to the bar
    foo foo foo
    Yippie, a bar.

Ответы [ 2 ]

9 голосов
/ 14 июля 2009

Вы можете использовать опцию -B для включения строк контекста до совпадения (есть также -A для включения строк контекста после и -C для включения строк контекста до и после). Затем вы можете передать результат в другой grep:

# Get all lines matching 'bar' and include one line of context before each match
# Then, keep only lines matching 'bar' or 'foo'
grep bar -B1 the-file | grep 'bar\|foo'
0 голосов
/ 15 июля 2009

не нужно использовать grep 2 раза

awk '/bar/ && p~/foo/{
  print p
  print  
  next
}/bar/{print}{ p=$0}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...