Попробуйте разбить операцию на несколько шагов, каждый из которых можно выполнить, используя разные программы с их базовыми функциями.
Например, сначала найдите шаблон /z ~/
и напечатайте следующие 6 строк (grep -A6 "z ~"
), затем напечатайте 4-ю, 5-ю и 6-ю строки. столбцы. Наконец, отфильтруйте только те, в которых есть цифра, чтобы линия между совпадением шаблона и цифрами была отброшена.
Чтобы обернуть его в команду:
grep -A6 "z ~" file | awk '{ print $4, $5, $6 }' | grep -E "[[:digit:]]"`
Это не - контекст
, а \ s *
в начале вашего шаблона регулярного выражения.
Кажется, что ag
не выполняет построчный поиск, как обычный grep
, а просматривает весь файл за один раз (или, по крайней мере, несколько строк за раз время). Немного похоже на этот однострочник Perl:
perl -0777 -ne 'print "$&\n" while /^\s*(def|class)\s+[_A-Za-z]*/msg' ../prog.py
Итак, поскольку \ s
соответствует любому пробелу, включая символы новой строки, он соответствует предыдущей пустой строке, новой строке, пробелам перед следующей, а затем ключевое слово def
. Если вы добавите пустую строку перед строкой blah
, она не будет напечатана, поскольку blah
не соответствует шаблону.
Чтобы избавиться от нежелательного совпадения, используйте / ^ * ...
или / ^ [\ t] * ...
вместо / ^ \ s * ...
. (пробел + звездочка в первом)