Tenho um arquivo que possivelmente contém uma formatação incorreta (neste caso, a ocorrência do padrão \\backslash
). Eu gostaria de usar grep
para retornar apenas os números das linhas onde isso ocorre (como em, a correspondência estava aqui, vá para a linha # x e corrija).
No entanto, não parece haver uma maneira de imprimir o número da linha ( grep -n
) e não a correspondência ou a própria linha.
Posso usar outra regex para extrair os números de linha, mas quero ter certeza de que o grep não pode fazer isso sozinho. grep -no
chega mais perto, eu acho, mas ainda exibe a correspondência.
grep -no
:! Isso fez o que eu vim aqui tentar fazer! (ou seja, não imprimir a linha que às vezes é muito longa, por exemplo, arquivos de origem javascript minificados.)Respostas:
experimentar:
fonte
-f
param. Para mim foi-f2
. (Sei que isso é coisa velha, mas acho que pode ajudar algumas pobres almas)grep -n "text to find" file.ext | cut -f1,2 -d:
mostra o nome do arquivo e o número da linha.-H
para forçá-lo a mostrar o nome do arquivo quando houver apenas um arquivo. Por outro lado, você sempre pode usar-h
para dizer a ele para não imprimir o nome do arquivo, não importa quantos arquivos você esteja executando o grep.Se você está aberto para usar AWK:
Nesse caso, FNR é o número da linha. AWK é uma ótima ferramenta quando você está olhando para grep | cut, ou sempre que você está tentando pegar a saída do grep e manipulá-la.
fonte
NR
funciona bem quando há apenas um arquivo sendo examinado, como neste caso.Todas essas respostas requerem que o grep gere todas as linhas correspondentes e, em seguida, canalize-as para outro programa. Se suas linhas forem muito longas, pode ser mais eficiente usar apenas sed para gerar os números das linhas:
fonte
Versão Bash
fonte
Eu recomendo as respostas com
sed
eawk
apenas para obter o número da linha, em vez de usargrep
para obter a linha correspondente inteira e, em seguida, removê-la da saída comcut
ou outra ferramenta. Para completar, você também pode usar Perl:ou Ruby:
fonte
Você vai querer o segundo campo após os dois pontos, não o primeiro.
grep -n "text to find" file.txt | cut -f2 -d:
fonte
Para contar o número de linhas que correspondem ao padrão:
Para extrair o padrão correspondente
Para exibir os números de linha em que o padrão foi correspondido
fonte
usando apenas grep :
grep -n "text to find" file.ext | grep -Po '^[^:]+'
fonte