匹配多个文件时格式化 grep 的输出

匹配多个文件时格式化 grep 的输出

当搜索多个文件时,grep 的输出如下所示:

{FILE}:{MATCH}

这是一个问题,因为如果我双击该{FILE}部分,我至少还会选择(并复制)该部分,:可能还选择一些匹配项。我怎样才能让 grep 格式化其输出,如下所示:

{FILE} : {MATCH}

基本上,我想在列之前插入一个空格。 (可选后一项)

答案1

grep -T7/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-文件名图案<“$f”
完毕

--label=string实际上,“读取标准输入时,假设输入文件名是string”。  --with-filename-H简称)说,“打印每场比赛的文件名。”当有多个文件需要搜索时,这是默认设置。 IMNSHO,当您指定 时,它也应该默认打开--label,但它似乎不是这样工作的。由于我的代码(上面)在参数中的文件名中添加了一个空格--label,因此您得到的输出看起来像

文件名:线匹配模式

如果您的文件名来自find,请执行

寻找(路径...)(表达式)-exec sh -c 'grep --label="$1" -H图案< "$1"' sh {} ";"

相关内容