Есть ли какой-нибудь способ, которым я могу сказать, чтобы grep печатал каждую читаемую строку независимо от того, есть ли совпадение?
Option -C999
сделает свое дело при отсутствии опции для отображения всех контекстных строк. Большинство других вариантов grep также поддерживают это. Однако: 1) вывод не производится, если совпадения не найдено, и 2) эта опция отрицательно влияет на эффективность grep: когда-C
значение велико, многие строки могут быть временно сохранены в памяти, чтобы grep определил, какие строки контекста отображать, когда происходит совпадение. Обратите внимание, что реализации grep не загружают входные файлы, а читают несколько строк или используют скользящее окно поверх ввода. Часть «before» контекста должна храниться в окне (памяти), чтобы вывести строки контекста «before» позже, когда найдено совпадение.
Шаблон, такой как ^|PATTERN
или PATTERN|$
любой другой под-шаблон, соответствующий пустому совпадению, такой как [^ -~]?|PATTERN
хороший трюк. Тем не менее, 1) эти шаблоны не показывают несоответствующие строки, выделенные как контекст, и 2) это не может быть использовано в сочетании с некоторыми другими опциями grep, такими как -F
и-w
, например.
Так что ни один из этих подходов не устраивает меня. Я использую ugrep и расширенный grep с возможностью -y
эффективно отображать все несоответствующие выходные данные в виде выделенных цветом строк контекста. Другие инструменты, подобные grep, такие как ag и ripgrep, также предлагают возможность сквозного доступа. Но ugrep совместим с GNU / BSD grep и предлагает расширенный набор опций grep, таких как -y
и -Q
. Например, вот что -y
отображается в сочетании с -Q
(интерактивный интерфейс запросов для ввода шаблонов):
ugrep -Q -y FILE ...
sed
.sed
решение получает вас несколько цветов за счет дополнительной сложности (вместо примерно 30 символов , имеющих около 60 символов).