変数がリストにあることを確認する

変数がリストにあることを確認する

特定の単語が単語リストにあるかどうかを確認するために、次のスクリプトを作成しました。

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


while IFS= read -r word; do


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

しかし、まだチェックは完了していません。単語リストさえ一度も確認していません

このファイルにはt.txtSQLクエリのリストが含まれています。

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

関連情報