Não está muito claro ...
grep -owf champs.txt t.txt
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
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