입력 파일 이름이 name.json 형식인지 확인하기 위해 bash 스크립트를 실행하려고 합니다. bash의 regx는 작동하지 않지만 grep에서는 작동합니다.
문서t1.sh
echo "$1"
regx="^[\w\d-]+[.]json$"
echo $regx
[[ $1 =~ $regx ]] && echo "match" || echo "No Match"
echo $1 | grep -P $regx
test=$(echo $1 | grep -P $regx)
[[ -z $test ]] && echo "Grep No match" || echo "Grep match"
산출
$ ./t1.sh test-file.json
test-file.json
^[\w\d-]+[.]json$
No Match
test-file.json
Grep match
$ ./t1.sh test-file123.json
test-file123.json
^[\w\d-]+[.]json$
No Match
test-file123.json
Grep match
$ ./t1.sh test-file$.json
test-file$.json
^[\w\d-]+[.]json$
No Match
Grep No match
Bash가 메타문자를 처리할 수 없는 이유는 무엇입니까? 나는 regx를 인용하면 문자 이스케이프 문제가 해결된다고 생각합니다.
답변1
의견에서 알 수 있듯이 사람들은 정규식을 구현하는 데 호환되지 않는 다양한 방법을 선택했습니다. Fine bash 매뉴얼은 섹션 7의 정규식 매뉴얼을 가리키는 섹션 3의 정규식 매뉴얼을 가리킵니다. 읽으면 [\w\d-]
세 문자 중 하나가 일치한다는 것을 알 수 있습니다 w
d
-
.
[[:alnum:]-]
대신 사용하면 [\w\d-]
원하는 작업이 수행됩니다.
답변2
달리 언급했듯이, 다양한 도구에는 정규식의 다양한 구현/확장이 있습니다.
요구 사항을 충족하는 경우 grep -P
(참고로 사용 중인 스위치는 일반적으로 존재하지 않는 Perl 호환 Reg Ex 기능을 활성화함 grep
) 이를 사용하십시오. 귀하의 예에서는 다음과 같이 구현하는 것이 좋습니다.
grep -Pq "$regx" <<< "$1" && echo "Grep No match" || echo "Grep match"