На ваш первый вопрос, насколько мне известно, можно ответить, перейдя на grep
другим способом. Когда вы отправляете ему список файлов (или каталог для рекурсии с помощью -r
или -R
), он всегда будет выводить, в каком файле он нашел совпадение, а также номер строчки. Вы можете обойти это с помощью такой конструкции, как:
find /path/to/files -type f | xargs grep -n 'the_pattern'
Что касается вашего второго вопроса, если вы хотите увидеть строки до и после совпадения, вы можете использовать -C
(для C ontext) переключатель:
grep -C2 'pattern' /path/to/file # displays the two lines before and after a match
К -C
относятся -A
(для A fter) и -B
(для B efore), которые дают только указанное количество строк после или до совпадения, соответственно.
Вы можете объединить два ответа следующим образом:
find /path/to/files -type f | xargs grep -n -C2 'the_pattern'
Что касается вашего вопроса о sed
, приведенный вами пример работает, только если вы уже знаете номера строк. Вы также можете сделать что-то вроде:
sed -n '/the_pattern/p' /path/to/files/*
(но это не будет рекурсивно по подкаталогам)