Por que o simples uso do grep não resulta em nenhum resultado?

1

Eu usei o find para fazer um arquivo de texto contendo tudo em um disco rígido externo que tenha a extensão .mp3 e .wma. Eu queria tentar usar o grep no arquivo para visualizar os arquivos sem os diretórios anteriores (apenas as linhas em si parecerão menos confusas). No entanto, quando eu digito isso:

grep -h "*.mp3" mp3sCIR.txt 

nada aparece. Sim, está escrito corretamente e o arquivo realmente contém a listagem. Eu tentei remover o -h e ainda nada. O Egrep funciona, mas não suprime o nome do arquivo / caminho, como solicitado.

    
por thinksinbinary 26.08.2016 / 03:24

1 resposta

2

Primeiro, você parece estar entendendo mal o que a -h flag faz.

-h suprimirá o (s) nome (s) dos arquivos transmitidos na linha de comando (ou seja, mp3sCIR.txt - embora quando apenas um único arquivo for fornecido, o nome não seja impresso por padrão) - ele não será removido qualquer coisa dos nomes dos arquivos dentro do arquivo.

Em segundo lugar, você está confundindo padrões de shell (também conhecidos como 'globs') e expressões regulares - o grep usa a sintaxe de regex, portanto, para corresponder nomes de arquivos com a extensão .mp3 você precisaria 1

grep ".*\.mp3" mp3sCIR.txt 

(que deve funcionar da mesma forma com ou sem o -E , pois as formas básica e estendida são idênticas).

Para remover os componentes principais do nome do caminho (por exemplo, o que você estava tentando fazer com -h ), você poderia usar

grep -o "[^/]*\.mp3"  mp3sCIR.txt

para imprimir o apenas a parte correspondente que não inclui separadores de caminho, ou com o modo grep in perl compatível (PCRE)

grep -Po ".*/\K.*\.mp3" mp3sCIR.txt


Para referência futura, você pode ter salvo os nomes sem os componentes de caminho principal usando o formato de saída find -printf '%f\n' .

[1] Na verdade, parece que enquanto o BRE trata um * no início de um padrão como literal, ERE (isto é, egrep / grep -E ) parece tratá-lo como um quantificador para uma expressão vazia ( "zero ou mais instâncias de nada"; portanto, grep -E "*.mp3" faz corresponder às entradas com o sufixo .mp3 - mas não pelo motivo que você provavelmente pensaria.

    
por steeldriver 26.08.2016 / 03:37