Pegue um arquivo de regexes e retorne a primeira correspondência para cada um em outro arquivo

2

Eu tenho dois arquivos. a.txt tem uma lista de expressões regulares, separadas por novas linhas. b.txt tem linhas, algumas das quais correspondem às expressões regulares em a.txt .

O que eu quero: Um comando (grep, provavelmente) que levará os dois arquivos, e para cada linha em a.txt imprime a primeira correspondência de linha inteira de b.txt . Uma solução ideal também imprimirá o próprio regex como prefixo e, se não houver correspondência, imprimirá "sem correspondência" ou algo diferente. Uma falta de um ou ambos é, no entanto, bom o suficiente.

O que estou usando atualmente para testar soluções:

a.txt:

[abc]*qs
ab[cqs]*
w+x+

b.txt:

aqs
abqs
abs

As melhores coisas que tentei são grep -xf a.txt b.txt , que imprime

aqs
abqs
abs

e grep -xcf a.txt b.txt , que imprime 3 .

A saída ideal seria

[abc]*qs aqs
ab[cqs]* abqs
w+x+ None

A saída minimamente aceitável seria

aqs
abqs
    
por Jacob Kopczynski 15.09.2018 / 03:39

1 resposta

1
while read -r pattern; do
   printf '%s ' "$pattern"
   grep -x -m 1 "$pattern" b.txt || printf '%s\n' 'None'
done <a.txt

Funciona lendo padrões um por um, executando grep para cada um deles e imprimindo ( printf ) informações adicionais quando necessário.

Nota: grep -m 1 pára após a primeira correspondência encontrada, mas não é POSIX. Se você não tiver essa opção, substitua a linha que contém grep por esta:

{ grep -x "$pattern" b.txt || printf '%s\n' 'None'; } | head -n 1
    
por 15.09.2018 / 07:26