Форматирование вывода grep при сопоставлении нескольких файлов

Форматирование вывода grep при сопоставлении нескольких файлов

При поиске в нескольких файлах вывод grep выглядит примерно так:

{FILE}:{MATCH}

Это проблема, поскольку если я дважды щелкну по {FILE}части, я по крайней мере также выберу (и скопирую) :и, возможно, часть совпадения. Как мне заставить grep вместо этого отформатировать вывод примерно так:

{FILE} : {MATCH}

По сути, я хочу вставить пробел перед столбцом (и, при желании, один после).

решение1

grep -Tбудет работать в 7/8 случаев.

% for f in a ab abc abcd abcde abcdef abcdefg abcdefgh; do echo pattern > $f; done
% grep -T pattern *
a      :pattern
ab     :pattern
abc    :pattern
abcd   :pattern
abcde  :pattern
abcdef :pattern
abcdefg:pattern
abcdefgh       :pattern

ИзРуководство по GNU grep:

-T --initial-tab

Убедитесь, что первый символ фактического содержимого строки лежит на позиции табуляции, чтобы выравнивание вкладок выглядело нормально. Это полезно с параметрами, которые добавляют префикс к своему выводу фактического содержимого: -H, -n, и -b. Чтобы повысить вероятность того, что все строки из одного файла будут начинаться в одном столбце, это также приводит к тому, что номер строки и смещение в байтах (если есть) печатаются в поле минимальной ширины.

решение2

Насколько я могу судить , это не может быть сделано само по себе. Предполагая, что в grepименах ваших файлов нет ::

grep ... | sed 's/:/ : /'

Только первый :будет дополнен.

Конечно, вы можете указать, grepчто нужно печатать только имена файлов:

grep -l ...

решение3

Что представляет собойсловоЧто касается выбора двойным щелчком, то он зависит от терминала (и/или инструментария X) и для некоторых терминалов может быть настраиваемым.

Для xterm,Персонажи организованы вклассы(буквы, пробелы...) и двойной щелчок выделяет соседние символы того же класса.

Значение по умолчанию описанотам. В этом случае по :умолчаниюнетв том же классе, что и /он сам, а не в том же классе, что и буквы или цифры.

Некоторые системы изменяют это значение по умолчанию, предоставляяфайл ресурсадля xtermлайка /etc/X11/app-defaults/XTerm.

В системе Linux Mint я нахожу там:

! Here is a pattern that is useful for double-clicking on a URL:
*charClass: 33:48,35:48,37-38:48,43-47:48,58:48,61:48,63-64:48,95:48,126:48

Это помещает символы 58 ( :) и 47 в тот же класс, что и буквы и цифры (48).

Что вы можете сделать, так это изменить это, оставив :его в отдельном классе через свой собственный файл ресурсов.

Например, если вы добавите:

XTerm*charClass: 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

к вашему ~/".Xdefaults-$(uname -n)", то двойной щелчок по имени файла остановит поиск на :.

Вы можете поэкспериментировать с этим:

xterm -cc 33:48,35:48,37-38:48,43-47:48,61:48,63-64:48,95:48,126:48

Вы также можете определить другой метод выбора при тройном или четверном щелчке как регулярное выражение. Например

XTerm*on3Clicks: regex [^:]+

Выберет последовательности символов, не являющихся двоеточиями, притройной щелчок.

решение4

Это крайне неэффективно, поскольку приводит к созданию нового grepпроцесса для каждого входного файла, но:

Имея список файлов (например, *), выполните следующие действия:

для f всписок_файлов
делать
    grep --label="$f " --with-filenameшаблон< "$ф"
сделанный

--label=stringговорит, по сути, «При чтении стандартного ввода, представьте, что имя входного файла — string».  --with-filename( -Hдля краткости) говорит, «Вывести имя файла для каждого совпадения». Это значение по умолчанию, когда нужно искать более одного файла. IMNSHO, оно также должно быть включено по умолчанию, когда вы указываете --label, но, похоже, так не работает. Поскольку мой код (выше) добавляет пробел к имени файла в аргументе --label, вы получаете вывод, который выглядит как

имя файла:Шаблон соответствия линий

Если ваши имена файлов взяты из find, сделайте следующее:

находить(путь…) (выражение)-exec sh -c 'grep --label="$1 " -Hшаблон< "$1"' ш {} ";"

Связанный контент