Lendo padrões grep de um arquivo

49

Eu tenho alguns arquivos de texto grandes e no arquivo UNIQS.txteu tenho uma lista de strings grepde outro arquivo. O código que eu uso é

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

que não faz nada - o arquivo gerado está vazio. Mas quando eu faço

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

funciona corretamente. Isso me confunde porque acho que não grepinterpretaria as entradas UNIQS.txtcomo padrões de expressão regular, sem aspas e barras, e assim por diante, no arquivo (o que não existe). É o caso geral de que, se você estiver obtendo os padrões de um arquivo, ele automaticamente pensará que são padrões de expressão regular?

Editar: no UNIQS.txtarquivo, existem seqüências separadas por nova linha do formulário

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(chamados nomes de modelos) e as EEP_VSL...colunas separadas pela guia arquivo , com cerca de 14 colunas e a primeira coluna é o nome do modelo, então basicamente quero extrair a linha correspondente a cada modelo no arquivo.

sdf
fonte

Respostas:

60

A -fopção especifica um arquivo em que grep lê padrões. É como passar padrões na linha de comando (com a -eopção se houver mais de um), exceto que quando você está chamando de um shell, pode ser necessário citar o padrão para proteger caracteres especiais nele de serem expandidos pelo shell.

O argumento -Eou -Fou -P, se houver, diz ao grep em que sintaxe os padrões estão escritos. Sem argumento, o grep espera expressões regulares básicas ; com -E, grep espera expressões regulares estendidas ; com -P(se suportado), grep espera expressões regulares do Perl ; e com -F, grep espera cadeias literais. Se os padrões vêm da linha de comando ou de um arquivo, não importa.

Observe que as strings são substrings: se você passar a+bcomo padrão, uma linha contendo a+b+cserá correspondida. Se você deseja procurar linhas contendo exatamente uma das seqüências fornecidas e não mais, passe a -xopção

Gilles 'SO- parar de ser mau'
fonte
1
Ok, isso é útil, obrigado. Posso perguntar, suponha que eu quisesse corresponder exatamente à sequência, ou seja, se a sequência for 12345, quero que ela corresponda apenas no 12345, não no 123456 ou 123455 etc., como eu faria isso?
Sdf
2
@sdf Leia meu último parágrafo:-x
Gilles 'SO- stop be evil'
Isso é tão antigo, desculpe por desenterrá-lo. Embora a explicação acima seja incrível, é um pouco vago o motivo pelo qual os padrões (cadeias) do arquivo não coincidem sem o -Fsinalizador. Meu palpite é que -na linha de amostra acima faz com que isso seja lido como uma sequência de caracteres? Isso não exigiria colchetes também? Eu testei com alguns arquivos de exemplo, mas não cheguei a uma conclusão.
trs 23/06
@trs A linha mostrada na pergunta (que foi adicionada depois que eu postei minha resposta) não contém nenhum caractere que tenha um significado especial em regexps, portanto, ele se comporta da mesma maneira com e sem -F. Isso faria diferença com personagens como \[*^$.
Gilles 'SO- stop be evil'
@Gilles obrigado, essa também foi minha impressão, mas o @sdf afirma que "o arquivo gerado está vazio" (leia-se: sem correspondências) sem a -Fbandeira?
trs 23/06
0

Eu tive o mesmo erro, não resolvido com a boa resposta do @gilles. Olhando mais de perto no arquivo de entrada, encontrei duas novas linhas no final. Sem isso, o sucesso é necessário apenas: arquivo grep -i file_pattern_input

(GNU grep 3.1, arquivo de entrada com mais de 5000 registros, arquivo de correspondência / padrão 2536, eu sabia que todos os 2536 deveriam estar no arquivo. Com novas linhas, todas as linhas do arquivo e sem apenas as 2536 linhas correspondentes)

th_k
fonte
1
Isso não tem relação com o problema do OP. Uma linha vazia é lida pelo grep como um padrão vazio, e um padrão vazio corresponde a todos os lugares.
muru 17/07