首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在bash中使用regex来匹配大小写字母?

如何在bash中使用regex来匹配大小写字母?
EN

Unix & Linux用户
提问于 2020-11-10 19:00:59
回答 3查看 15.4K关注 0票数 8

我们设置了以下变量

代码语言:javascript
运行
复制
status=ok
echo $status
ok

现在我们要验证使用regex的变量是否匹配。

如下所示

代码语言:javascript
运行
复制
[[ $status =~ [OK]  ]] && echo "is the same"
[[ $status =~ OK  ]] && echo "is the same"
[[ $status =~ "OK"  ]] && echo "is the same"

但上述任何一种非印刷品“都是相同的”。

我的领地出什么问题了?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2020-11-10 19:06:02

[OK]将匹配括号中的任一字符,方括号不会告诉它不区分大小写。

你可以这样做:

代码语言:javascript
运行
复制
[[ "$status" =~ ^[Oo][Kk]$ ]]

或者我可能会做以下的事情:

代码语言:javascript
运行
复制
[[ "${status,,}" == ok ]]

用于参数展开的,,运算符将将整个变量转换为小写,以便进行比较。

票数 17
EN

Unix & Linux用户

发布于 2020-11-11 06:06:09

[[ $status =~ OK ]] (或[[ $status =~ "OK" ]])匹配如果$status 包含 OK,而[[ $status =~ [OK] ]]匹配它<>包含该OK集合中的一个字符,则为OK

对于正则表达式,如果要将主题作为一个整体而不是在主题中匹配,则需要使用^$分别在主题的开头和结尾锚定模式。

要在bash中执行不区分大小写的匹配,可以使用nocasematch选项:

这适用于与Korn样式的[[ $var = pattern ]]或标准case $var in (pattern)的shell模式匹配,以及与[[ $var =~ regexp ]]的regexp匹配。

所以,在这里你可以:

代码语言:javascript
运行
复制
shopt -s nocasematch
[[ $status = ok ]] && echo yes
[[ $status =~ ^ok$ ]] && echo yes
case $status in
  (ok) echo yes
esac

(您可能希望在结束后取消nocasematch设置,或者将其重置为以前的值(请参阅typeset restore="$(shopt -p nocasematch)"以保存,eval "$restore"用于恢复),因为保持此状态将影响所有模式匹配操作)。

或者你可以用:

代码语言:javascript
运行
复制
[[ $status = [oO][kK] ]] && echo yes
[[ $status =~ ^[oO][kK]$ ]] && echo yes
case $status in
  ([oO][kK]) echo yes
esac
case $status in
  (ok | OK | Ok | oK) echo yes
esac

基于case的变体是标准的POSIX sh语法。

zsh外壳中,您可以使用扩展的globing操作符或PCRE操作符,而不是全局地打开全局nocasematch选项(并扭曲所有模式匹配操作符),这些操作符可以选择性地对单个模式或单个模式的一部分启用不区分大小写的匹配。

例如,

代码语言:javascript
运行
复制
set -o extendedglob
[[ $status = (#i)ok ]]

或者:

代码语言:javascript
运行
复制
zmodload zsh/pcre
[[ $status -pcre-match '^(?i)ok或相当于bash's ${var,,},使用$var:làla csh或${(L)var}:[ "$status:l" = ok ]在zsh中,您应该避免使用名为$status的变量,因为该变量保存了前面命令的退出状态,并将其作为Bourne样式$?的别名,就像大多数非伯恩shell (csh、tcsh、rc、es、fish )一样。在Korn的ksh93变体(它的bash和zsh都复制了[[...]] )中,您可以执行[[ $status = ~(i)ok ]]。 ]]

或相当于D26's D27,使用D28àla csh或D29D30

D31中,您应该避免使用名为D32的变量,因为该变量保存了前面命令的退出状态,并将其作为Bourne样式D33的别名,就像大多数非伯恩shell (csh、tcsh、rc、es、fish )一样。

在Korn的ksh93变体(它的bash和zsh都复制了D34 )中,您可以执行D35

票数 10
EN

Unix & Linux用户

发布于 2020-11-11 05:53:54

您可以这样做模式匹配:

代码语言:javascript
运行
复制
[[ $status == @(ok|OK|okay) ]] && echo "is the same"

或者,类似于jesse在上一篇文章中的想法,用于参数展开的^^操作符将将整个变量转换为大写,以便进行比较:

代码语言:javascript
运行
复制
[[ "${status^^}" == OK ]] && echo "is the same"
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/618963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档