为了账号安全,请及时绑定邮箱和手机立即绑定

带引号的bash正则表达式?

/ 猿问

带引号的bash正则表达式?

三国纷争 2019-07-24 14:58:38

带引号的bash正则表达式?

以下代码

number=1if [[ $number =~ [0-9] ]]then
  echo matchedfi

作品。但是,如果我尝试在正则表达式中使用引号,它会停止:

number=1if [[ $number =~ "[0-9]" ]]then
  echo matchedfi

我也试过"\[0-9\]"了。我错过了什么?

有趣的是,bash高级脚本指南表明这应该有效。

Bash版本3.2.39。


查看完整描述

3 回答

?
月关宝盒

Bash 3.2引入了兼容性选项compat31,它将bash正则表达式引用行为恢复为3.1

没有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


查看完整回答
反对 回复 2019-07-24
?
繁华开满天机

GNU bash,版本4.2.25(1)-release(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


查看完整回答
反对 回复 2019-07-24

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信