따옴표로 정규식을 bash?
다음 코드
number=1
if [[ $number =~ [0-9] ]]
then
echo matched
fi
공장. 그러나 정규식에서 따옴표를 사용하려고하면 중지됩니다.
number=1
if [[ $number =~ "[0-9]" ]]
then
echo matched
fi
나도 시도 "\[0-9\]"
했다. 내가 무엇을 놓치고 있습니까?
재미있게도 bash 고급 스크립팅 가이드 는 이것이 작동해야한다고 제안합니다.
Bash 버전 3.2.39.
3.1과 3.2 사이 에서 변경되었습니다 . 고급 가이드에 업데이트가 필요하다고 생각합니다.
이것은 bash-3.1 릴리스 이후 bash-3.2에 추가 된 새로운 기능에 대한 간결한 설명입니다. 항상 그렇듯이 매뉴얼 페이지 (doc / bash.1)는 완전한 설명을 찾을 수있는 곳입니다.
- Bash의 새로운 기능
한조각
에프. [[명령의 = ~ 연산자에 문자열 인수를 인용하면 다른 패턴 일치 연산자와 마찬가지로 문자열 일치가 강제 실행됩니다.
슬프게도 패턴을 변수에 저장하고 정규 표현식 대신 직접 사용하는 통찰력이 없다면 스크립트를 사용하여 기존 인용문을 깨뜨릴 것입니다. 아래 예.
$ bash --version
GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
$ if [[ $number =~ [0-9] ]]; then echo match; fi
match
$ re="[0-9]"
$ if [[ $number =~ $re ]]; then echo MATCH; fi
MATCH
$ bash --version
GNU bash, version 3.00.0(1)-release (i586-suse-linux)
Copyright (C) 2004 Free Software Foundation, Inc.
$ number=2
$ if [[ $number =~ "[0-9]" ]]; then echo match; fi
match
$ if [[ "$number" =~ [0-9] ]]; then echo match; fi
match
Bash 3.2는 bash 정규 표현식 인용 동작을 3.1로 되 돌리는 호환성 옵션 compat31을 도입했습니다.
compat31없이 :
$ shopt -u compat31
$ shopt compat31
compat31 off
$ set -x
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ \[0-9] ]]
+ echo no match
no match
compat31 사용 :
$ shopt -s compat31
+ shopt -s compat31
$ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi
+ [[ 9 =~ [0-9] ]]
+ echo match
match
패치 링크 : http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-039
GNU bash, 버전 4.2.25 (1)-릴리스 (x86_64-pc-linux-gnu)
문자열 일치 및 정규식 일치의 몇 가지 예
$ if [[ 234 =~ "[0-9]" ]]; then echo matches; fi # string match
$
$ if [[ 234 =~ [0-9] ]]; then echo matches; fi # regex natch
matches
$ var="[0-9]"
$ if [[ 234 =~ $var ]]; then echo matches; fi # regex match
matches
$ if [[ 234 =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9]
$ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9]
$ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # regex match after substituting $var as [0-9]
matches
$ if [[ "rss\$var919" =~ "$var" ]]; then echo matches; fi # string match won't work
$ if [[ "rss\\$var919" =~ "$var" ]]; then echo matches; fi # string match won't work
$ if [[ "rss'$var'""919" =~ "$var" ]]; then echo matches; fi # $var is substituted on LHS & RHS and then string match happens
matches
$ if [[ 'rss$var919' =~ "\$var" ]]; then echo matches; fi # string match !
matches
$ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match failed
$
$ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match
matches
$ echo $var
[0-9]
$
$ if [[ abc123def =~ "[0-9]" ]]; then echo matches; fi
$ if [[ abc123def =~ [0-9] ]]; then echo matches; fi
matches
$ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match due to single quotes on RHS $var matches $var
matches
$ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # Regex match
matches
$ if [[ 'rss$var' =~ $var ]]; then echo matches; fi # Above e.g. really is regex match and not string match
$
$ if [[ 'rss$var919[0-9]' =~ "$var" ]]; then echo matches; fi # string match RHS substituted and then matched
matches
$ if [[ 'rss$var919' =~ "'$var'" ]]; then echo matches; fi # trying to string match '$var' fails
$ if [[ '$var' =~ "'$var'" ]]; then echo matches; fi # string match still fails as single quotes are omitted on RHS
$ if [[ \'$var\' =~ "'$var'" ]]; then echo matches; fi # this string match works as single quotes are included now on RHS
matches
다른 답변에서 언급했듯이 정규식을 변수에 넣는 것은 다른 bash 버전에서 호환성을 달성하는 일반적인 방법 입니다. 이 해결 방법을 사용하여 조건식 내에서 정규식을 유지하면서 동일한 작업을 수행 할 수도 있습니다.
$ number=1
$ if [[ $number =~ $(echo "[0-9]") ]]; then echo matched; fi
matched
$
참고URL : https://stackoverflow.com/questions/218156/bash-regex-with-quotes
'Nice programing' 카테고리의 다른 글
Julia의 잘못 작성된 R 예제 속도 향상 (0) | 2020.10.26 |
---|---|
ActiveRecord 또는 쿼리 해시 표기법 (0) | 2020.10.26 |
파이썬에 대한 일반적인 캐치 (0) | 2020.10.26 |
1 시간보다 오래된 -mtime 파일 찾기 (0) | 2020.10.26 |
결국 HTML보다 XHTML을 선택하는 이유는 무엇입니까? (0) | 2020.10.26 |