Formatando a saída do grep ao combinar vários arquivos

Formatando a saída do grep ao combinar vários arquivos

Ao pesquisar vários arquivos, a saída do grep é semelhante a esta:

{FILE}:{MATCH}

Isso é um problema, pois se eu clicar duas vezes na {FILE}parte, pelo menos também selecionarei (e copiarei) :e possivelmente parte da correspondência. Como posso fazer com que o grep formate sua saída da seguinte forma:

{FILE} : {MATCH}

Basicamente, quero inserir um espaço antes da coluna. (e opcionalmente um depois)

Responder1

grep -Tfuncionará 7/8 do tempo.

% 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

DeManual grep do GNU:

-T --initial-tab

Certifique-se de que o primeiro caractere do conteúdo da linha real esteja em uma parada de tabulação, para que o alinhamento das tabulações pareça normal. Isso é útil com opções que prefixam sua saída ao conteúdo real: -H, -ne -b. Para melhorar a probabilidade de que todas as linhas de um único arquivo comecem na mesma coluna, isso também faz com que o número da linha e o deslocamento de byte (se presente) sejam impressos em uma largura de campo de tamanho mínimo.

Responder2

grepPelo que sei, isso não pode ser feito por si só. Supondo que seus nomes de arquivos não contenham ::

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

Apenas o primeiro :será preenchido.

Claro, você pode grepimprimir apenas nomes de arquivos:

grep -l ...

Responder3

O que constitui umpalavrano que diz respeito à seleção com clique duplo, depende do terminal (e/ou do kit de ferramentas X) e, para alguns terminais, é personalizável.

Para xterm,personagens são organizados emAulas(letras, espaços...) e clicar duas vezes seleciona caracteres adjacentes da mesma classe.

O padrão é descrito. Nesse padrão, :énãona mesma classe que /ele próprio, não na mesma classe que letras ou dígitos.

Alguns sistemas alteram esse padrão fornecendo umarquivo de recursopara xtermgostar /etc/X11/app-defaults/XTerm.

Em um sistema Linux Mint, encontro:

! 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

Isso coloca os caracteres 58 ( :) e 47 na mesma classe que letras e dígitos (48).

O que você poderia fazer é mudar isso para deixar :sua própria classe através de seu próprio arquivo de recursos.

Por exemplo, se você adicionar:

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

para o seu ~/".Xdefaults-$(uname -n)"e clicar duas vezes no nome do arquivo irá parar no arquivo :.

Você pode experimentar com:

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

Você também pode definir um método de seleção diferente com clique triplo ou quádruplo como uma expressão regular. Por exemplo

XTerm*on3Clicks: regex [^:]+

Selecionaria sequências de caracteres sem dois pontos emclique três vezes.

Responder4

Isso é extremamente ineficiente, pois resulta na geração de um novo grepprocesso para cada arquivo de entrada, mas:

Dada uma lista de arquivos (por exemplo, *), faça

para f emlista_arquivos
fazer
    grep --label="$f " --with-filenamepadrão<"$f"
feito

--label=stringdiz, com efeito, “Ao ler a entrada padrão, finja que o nome do arquivo de entrada é string.”  --with-filename( -Habreviadamente) diz: “Imprima o nome do arquivo para cada correspondência”. Este é o padrão quando há mais de um arquivo para pesquisar. IMNSHO, também deve estar ativado por padrão quando você especifica --label, mas não parece funcionar dessa maneira. Como meu código (acima) adiciona um espaço ao nome do arquivo no argumento to --label, você obtém uma saída semelhante a

nome do arquivo:Padrão de correspondência de linha

Se seus nomes de arquivos vierem de find, faça

encontrar(caminho…) (expressão)-exec sh -c 'grep --label="$1 " -Hpadrão< "$1"' sh {} ";"

informação relacionada