
При поиске в нескольких файлах вывод 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
-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"' ш {} ";"