verificar se uma variável está na lista

1

para verificar se uma palavra está em uma lista de palavras ou não, escrevi este script:

tr -s '[[:blank:]]' '\n' < t.txt |


while IFS= read -r word; do


if [[ "$word" =~ $(echo ^\($(paste -sd'|' ./champs.txt)\)$) ]]; then

mas a verificação não é feita. Mesmo a lista de palavras não foi verificada a qualquer momento

O arquivo t.txt contém uma lista de consultas sql:

select * from student;
insert name, age, from professors;
delete from departement where DPTNUM= '20';

e o arquivo champs.txt contém as palavras-chave de consulta

select
insert
into
values
delete
drop
from
create
table
where
set
varchar
number
    
por Aomine Daiki 13.04.2015 / 12:08

2 respostas

1

Não está muito claro ...

grep -owf champs.txt  t.txt
    
por 13.04.2015 / 13:49
0

Seu comando de construção de regex está um pouco errado; além disso, é muito ineficiente reconstruir o mesmo padrão em todas as iterações de loop.

Embora bash tenha um comando read , geralmente é desencorajado usá-lo para processar grandes quantidades de texto, já que é muito lento, além de ser uma fonte comum de erros de script. Portanto, tente restringir o uso de read ao processamento da entrada simples do usuário.

Como outros já mencionaram, este é um trabalho para grep . Ou se você quiser mais controle, considere usar o awk, que tem boas habilidades de regex. Mas se você realmente quiser fazer isso de maneira semelhante ao seu código postado, aqui está uma maneira de fazer isso.

#!/usr/bin/env bash

pat='^('$(paste -sd'|' champs.txt)')$'
printf "pattern: '%s'\n" "$pat"

IFS=
tr -s '[:blank:]' '\n' < t.txt |
while read -r word; do
    if [[ "$word" =~ $pat ]]; 
        then echo "'$word' in list"
        else echo "'$word' NOT in list"
    fi
done

(O script acima passa pela análise ShellCheck ).

Como você pode ver, criamos o padrão de regex pat fora do loop; Eu adicionei um printf para exibir o padrão para que possamos ter certeza de que é o que queremos. Observe que geralmente é muito melhor usar printf do que echo para exibir strings arbitrárias.

Eu modifiquei seu t.txt para adicionar algumas palavras de teste extras, mas usei o mesmo champs.txt como postado acima.

t.txt

select * from student;
insert name, age, from professors;
delete from departement where DPTNUM= '20';
test number ins settle deleted

E aqui está a saída:

pattern: '^(select|insert|into|values|delete|drop|from|create|table|where|set|varchar|number)$'
'select' in list
'*' NOT in list
'from' in list
'student;' NOT in list
'insert' in list
'name,' NOT in list
'age,' NOT in list
'from' in list
'professors;' NOT in list
'delete' in list
'from' in list
'departement' NOT in list
'where' in list
'DPTNUM=' NOT in list
''20';' NOT in list
'test' NOT in list
'number' in list
'ins' NOT in list
'settle' NOT in list
'deleted' NOT in list
    
por 13.04.2015 / 14:49