Bash匹配字符串与正则表达式

时间:2014-08-15 17:21:05

标签: regex string bash

我正在使用bash 4.1.10(4)-release,我试图使用正则表达式来匹配两个大写字母[A-Z] {2},然后是任何东西。因此,例如BXCustomerAddressCAmaterial是可以接受的,但WarehouseMessage不会。我有以下脚本用于测试目的:

#!/bin/bash

if [[ "Ce" =~ [A-Z]{2} ]]; then
    echo "match"
fi

我的问题是:

  1. 当我运行此脚本时,为什么返回我有匹配?
  2. 有谁知道如何达到我想要的效果?

4 个答案:

答案 0 :(得分:4)

看起来您已启用shopt nocaseglob。使用以下命令将其关闭:

shopt -u nocaseglob

现在[[ "Ce" =~ [A-Z]{2} ]]不匹配,将返回false。

答案 1 :(得分:2)

检查shell选项nocasematch的值:

$ shopt nocasematch
nocasematch     off

答案 2 :(得分:1)

shopt nocasematch可能设置为on。用

将其关闭
shopt -u nocasematch

来自Bash Reference Manual

  

nocasematch

     

如果设置,Bash会以不区分大小写的方式匹配模式   执行大小写时执行匹配或[[条件命令。

答案 3 :(得分:0)

尝试了许多不同的组合后,这就是我预期的行为:

#!/bin/bash
# [A-Z][A-Z] will not work
# [:upper:][:upper:] will not work
# [[A-Z]][[A-Z]] will not work
# [[:upper:]][[:upper:]] does work

echo "test one"
if [[ "CA" =~ ^([[:upper:]][[:upper:]])+ ]]; then
    echo "match"
fi

echo "test two"
if [[ "Ce" =~ ^([[:upper:]][[:upper:]])+ ]]; then
    echo "match"
fi

我得到了预期的结果:

test one
match
test two

感谢大家的帮助