检查变量是否在列表中

检查变量是否在列表中

要检查某个单词是否在单词列表中,我编写了以下脚本:

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来显示图案,这样我们就可以确定这就是我们想要的。注意,一般是很多使用printfecho显示任意字符串更好。

我已经修改了您的内容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

相关内容