![메타 문자에 대해 bash 정규식이 실패하는 이유는 무엇입니까? [복사]](https://linux55.com/image/226081/%EB%A9%94%ED%83%80%20%EB%AC%B8%EC%9E%90%EC%97%90%20%EB%8C%80%ED%95%B4%20bash%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%B4%20%EC%8B%A4%ED%8C%A8%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
입력 파일 이름이 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"