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之间变化。 猜猜高级指南需要​​更新。

这是因为庆典-3.1的版本加入的bash-3.2的新功能的简洁描述。 与往常一样,使用手册(DOC / bash.1)是寻找完整说明的地方。

  1. Bash中的新功能

F。 引述字符串参数[命令的=〜运营商现在强制字符串匹配,与其他模式匹配操作。

可悲的是这将使用脚本,除非你有变量的有识之士来存储模式打破现有的报价,并直接使用正则表达式的他们,而不是。 下面的例子。

$ 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

猛砸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

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

ankura@u782bcba799915202a02b:~$ 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 eg 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
$

分类:正则表达式 时间:2012-01-01 人气:1
本文关键词: 正则表达式,庆典
分享到:

相关文章

  • 庆典:分配grep的正则表达式的结果数组 2014-10-14

    我想正则表达式的结果分配到一个数组bash脚本里面,但我不确定这是否是可能的,或者如果我这样做完全是错误的. 下面是我希望发生的,但是我知道我的语法不正确: indexes[4]=$(echo b5f1e7bfc2439c621353d1ce0629fb8b | grep -o '[a-f0-9]\{8\}') 使得: index[1]=b5f1e7bf index[2]=c2439c62 index[3]=1353d1ce index[4]=0629fb8b 任何链接或建议,将是美好:) --

  • 庆典/为正则表达式使用重建复杂的图案部分不一致的文件 2013-02-22

    我需要通过分割每行分成4段,插入分隔符象一个管道或重建的文件:插图中的每个环节. 我的问题是,该结构是有些不一致... 该文件看起来像这样: MIKE TESTUSER Some Text 21 - Etc BLA 43 BLA - Some, Additional..12 info STEVE NOBODY 43 More `Text and So on BLA (MORE ADDITIONAL info) LEROY ANYONE Again some text chars numbers

  • 正则表达式抢夺值x量在linux的庆典 2013-10-28

    嗨,大家好知道,如果你们能帮助我,我尝试编译bash脚本,它将从HTML代码段显示一些值,我被困在正则表达式的一部分, 我有以下的代码段 <li><div friendid="107647498" class="friendHelperBox"><div><a href="http://www.myspace.com/rockyrobsyn" class="msProfileTextLink&q

  • 庆典重命名使用正则表达式替换阵 2015-03-04

    我有一个非常类似的问题,作为这个职位. 我想知道如何使用指定的替换文件名中重命名occurances. 例如,如果原始文件被称为:"快速的棕色敏捷的棕色fox.avi"我想将它命名为"慢红红灯慢fox.avi". 我想这: new="(quick=>'slow',brown=>'red')" regex="quick|brown" rename -v "s/($regex)/$new{$1}/g"

  • 从正则表达式(SED)参数逃避保留字符 2012-04-09

    我想写一个属性文件修改变量的脚本. 用户输入新的值,它是依次写入到该文件中. read -p "Input Variable?" newVar sed -r 's/^\s*myvar=.*/myvar=${newVar}/' ./config.properties 不幸的问题,当用户输入特殊字符出现. 在我的使用情况下,它很可能是一个"/"字符输入. 所以我的猜测是,我要解析$ {} newVar所有斜线和逃生呢? 但如何? 有没有更好的办法? ----------

  • PCRE正则表达式匹配除了字组文本 2012-06-01

    我挣扎调整我的正则表达式来过滤掉 rlwrap 庆典 从: cat file user 30300 29384 0 Mar05 pts/4 00:00:00 /opt/bin/rlwrap /opt/test/l64/app apps/bin -gw :1234 -p 10006 user 30301 30300 0 Mar05 pts/5 00:00:00 /opt/test/l64/app apps/bin -gw :1234 -p 10006 user 30300 29384 0 Mar0

  • shell脚本和正则表达式 2012-08-17

    #!bin/bash echo enter your password : read password passlength=$(echo ${#password}) if [ $passlength -le 8 ]; then echo you entered correct password else echo entered password is incorrect fi if [[$password == [az]*[0-9][az]*]]; then echo match found

  • 你如何使用一个字符类加符号为正则表达式的一部分? 2012-09-14

    在Cygwin的,这不返回匹配: $ echo "aaab" | grep '^[ab]+$' 但这并返回匹配: $ echo "aaab" | grep '^[ab][ab]*$' aaab 是两个表达式不相同? 有什么办法来表达"字类的一个或多个字符"无需键入字符类两次(像例如秒)? 根据这个链接两个表达式应该是相同的,但也许Regular-Expressions.info不包括在Cygwin的庆典. --------------解决方案--

  • 我如何使用的bash脚本正则表达式? 2013-01-08

    我要检查,如果一个变量的使用正则表达式有效的一年. 阅读bash的说明书我明白我可以使用操作符=〜 看下面的例子,我希望看到"没有确定",但我看到"OK". 我究竟做错了什么? i="test" if [ $i=~"200[78]" ] then echo "OK" else echo "not OK" fi --------------解决方案------------- 它是3.1和3

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.163 (s). 10 q(s)