![변수가 목록에 있는지 확인](https://linux55.com/image/62914/%EB%B3%80%EC%88%98%EA%B0%80%20%EB%AA%A9%EB%A1%9D%EC%97%90%20%EC%9E%88%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
특정 단어가 단어 목록에 있는지 확인하기 위해 다음 스크립트를 작성했습니다.
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
루프; 이것이 우리가 원하는 것인지 확인할 수 있도록 패턴을 표시하기 위해 하나를 추가했습니다 . 참고로 보통많은임의의 문자열을 표시하는 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