변수가 목록에 있는지 확인

변수가 목록에 있는지 확인

특정 단어가 단어 목록에 있는지 확인하기 위해 다음 스크립트를 작성했습니다.

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루프; 이것이 우리가 원하는 것인지 확인할 수 있도록 패턴을 표시하기 위해 하나를 추가했습니다 . 참고로 보통많은임의의 문자열을 표시하는 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

관련 정보