特定の単語が単語リストにあるかどうかを確認するために、次のスクリプトを作成しました。
tr -s '[[:blank:]]' '\n' < t.txt |
while IFS= read -r word; do
if [[ "$word" =~ $(echo ^\($(paste -sd'|' ./champs.txt)\)$) ]]; then
しかし、まだチェックは完了していません。単語リストさえ一度も確認していません
このファイルにはt.txt
SQLクエリのリストが含まれています。
select * from student;
insert name, age, from professors;
delete from departement where DPTNUM= '20';
ファイルにはchamps.txt
クエリキーワードが含まれています。
select
insert
into
values
delete
drop
from
create
table
where
set
varchar
number
答え1
まだあまり明確ではありません...
grep -owf champs.txt t.txt
答え2
正規表現の作成コマンドが少し間違っています。さらに、すべてのループ反復で同じパターンを再構成することは非常に非効率的です。
bashにはコマンドがありますが、大量のread
テキストを処理するために使用することは通常お勧めできません。非常に遅く、スクリプトエラーの一般的な原因です。したがって、read
単純なユーザー入力を処理するためにのみ使用するように制限してください。
他の人が述べたように、それは職業ですgrep
。あるいは、より多くの制御が必要な場合は、正規表現機能に優れたawkの使用を検討してください。しかし、もしあなたが本物公開したコードと同様の方法でこれを行うには、次の方法があります。
#!/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
(上記のスクリプトは通過します。住宅検査分析)。
ご覧のとおり、正規表現パターンを構築しました。pat
外部printf
ループ;これが私たちが望むものであることを確認できるようにパターンを表示するために1つを追加しました。参考までにたくさん任意の文字列を表示するprintf
よりも使用する方が良いです。echo
t.txt
いくつかの追加のテストワードを追加するためにコンテンツを修正しましたが、champs.txt
上記で公開されているのと同じコンテンツを使用しました。
t.txt
select * from student;
insert name, age, from professors;
delete from departement where DPTNUM= '20';
test number ins settle deleted
出力は次のとおりです。
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