Nice programing

따옴표로 정규식을 bash?

nicepro 2020. 10. 26. 21:04
반응형

따옴표로 정규식을 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)는 완전한 설명을 찾을 수있는 곳입니다.

  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

다른 답변에서 언급했듯이 정규식을 변수에 넣는 것은 다른 버전에서 호환성을 달성하는 일반적인 방법 입니다. 이 해결 방법을 사용하여 조건식 내에서 정규식을 유지하면서 동일한 작업을 수행 할 수도 있습니다.

$ number=1
$ if [[ $number =~ $(echo "[0-9]") ]]; then echo matched; fi
matched
$ 

참고URL : https://stackoverflow.com/questions/218156/bash-regex-with-quotes

반응형