如何在 bash 脚本中使用正则表达式?

Posted

技术标签:

【中文标题】如何在 bash 脚本中使用正则表达式?【英文标题】:How do I use regular expressions in bash scripts? 【发布时间】:2010-09-23 05:20:14 【问题描述】:

我想使用正则表达式检查变量是否具有有效年份。阅读bash manual 我知道我可以使用运算符 =~

查看下面的示例,我希望看到“不正常”,但我看到“正常”。我做错了什么?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi

【问题讨论】:

bash regex with quotes?的可能重复 请注意,这是因为=~ 周围缺少空格而失败。 【参考方案1】:

它在 3.1 和 3.2 之间发生了变化:

这是对自 bash-3.1 发布以来添加到 bash-3.2 的新功能的简要描述。

将字符串参数引用到 [[ 命令的 =~ 运算符现在强制字符串匹配,与其他模式匹配运算符一样。

所以使用它不带引号:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi

【讨论】:

如果我不能引用正则表达式包含空格的情况,我该如何处理?如果正则表达式是例如a +b会报语法错误... @Alderath:使用a\ \+b 转义空格和加号。【参考方案2】:

运算符周围需要空格=~

我=“测试” 如果 [[ $i =~ "200[78]" ]]; 然后 回声“确定” 别的 回声“不好” 菲

【讨论】:

paxdiablo 的回答是对的,在这里添加空格并没有帮助(您现在也得到 2008 年的“不正常”,唯一匹配的字符串字面上是“200[78]”)。

以上是关于如何在 bash 脚本中使用正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 bash 脚本中使用正则表达式否定两个逻辑测试?

bash:在 shell 脚本中使用正则表达式查找和 grep

使用 linux 和 AIX 的正则表达式替换 bash 脚本中的字符串

使用正则表达式将字段拆分为数组的 Bash 脚本用于多字符分隔符

正则表达式从bash脚本中的字符串中提取第一个浮点数

识别 Bash 脚本中文件扩展名的正则表达式模式不准确以捕获压缩文件