在bash中的if-condition中使用正则表达式

Tim*_*Tim 84 regex bash

我想知道在bash的if子句中使用正则表达式的一般规则?

这是一个例子

$ gg=svm-grid-ch  
$ if [[ $gg == *grid* ]] ; then echo $gg; fi  
svm-grid-ch  
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi  
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi  
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi  
$   
Run Code Online (Sandbox Code Playgroud)

为什么最后三个不匹配?

希望你能尽可能多地给出一般规则,而不仅仅是这个例子.

Pau*_*ce. 121

使用glob模式时,问号表示单个字符,星号表示零个或多个字符的序列:

if [[ $gg == ????grid* ]] ; then echo $gg; fi
Run Code Online (Sandbox Code Playgroud)

使用正则表达式时,点表示单个字符,星号表示前面字符的零个或多个.因此" .*"表示任何字符的零个或多个," a*"表示零个或多个"a"," [0-9]*"表示零个或多个数字.另一个有用的(在许多中)是加号,它代表前面一个或多个字符.因此" [a-z]+"表示一个或多个小写字母字符(在C语言环境中 - 以及其他一些字符).

if [[ $gg =~ ^....grid.*$ ]] ; then echo $gg; fi
Run Code Online (Sandbox Code Playgroud)


Enr*_*sso 35

使用=〜

正则表达式检查正则表达式教程目录


vla*_*adr 7

为那些对更便携的解决方案感兴趣的人添加此解决方案grep和基本sh内置函数(独立于bash版本;也适用于普通旧版本sh,非Linux平台等)

# GLOB matching
gg=svm-grid-ch    
case "$gg" in
   *grid*) echo $gg ;;
esac

# REGEXP    
if echo "$gg" | grep '^....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep '....grid*' >/dev/null ; then echo $gg ; fi    
if echo "$gg" | grep 's...grid*' >/dev/null ; then echo $gg ; fi    

# Extended REGEXP
if echo "$gg" | egrep '(^....grid*|....grid*|s...grid*)' >/dev/null ; then
  echo $gg
fi    
Run Code Online (Sandbox Code Playgroud)

一些grep化身也支持-q(安静)选项作为重定向的替代选项/dev/null,但重定向再次是最便携的.

  • 使用`grep -q`而不是`grep>/dev/null`. (5认同)

gho*_*g74 5

@OP,

glob pettern 不仅仅用于文件名吗?

不,“glob”模式不仅用于文件名。您也可以使用它来比较字符串。在您的示例中,您可以使用 case/esac 来查找字符串模式。

 gg=svm-grid-ch 
 # looking for the word "grid" in the string $gg
 case "$gg" in
    *grid* ) echo "found";;
 esac

 # [[ $gg =~ ^....grid* ]]
 case "$gg" in ????grid*) echo "found";; esac 

 # [[ $gg =~ s...grid* ]]
 case "$gg" in s???grid*) echo "found";; esac
Run Code Online (Sandbox Code Playgroud)

在 bash 中,什么时候使用 glob 模式,什么时候使用正则表达式?谢谢!

正则表达式比“通配符模式”更通用且“方便”,但是除非您正在执行“通配符/扩展通配符”无法轻松提供的复杂任务,否则无需使用正则表达式。bash <3.2 的版本不支持正则表达式(如丹尼斯提到的),但您仍然可以使用扩展的通配符(通过设置extglob)。对于扩展的通配符,请参阅此处和此处的一些简单示例。

OP 更新:使用正则表达式查找以 2 个字符开头的文件(点“.”表示 1 个字符)后跟“g”的示例

例如输出

$ shopt -s dotglob
$ ls -1 *
abg
degree
..g

$ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done
abg
degree
..g
Run Code Online (Sandbox Code Playgroud)

在上面,文件被匹配,因为它们的名称包含 2 个字符,后跟“g”。(IE ..g)。

通配符的等价物将是这样的:(请参阅参考文献?以了解和 的含义*

$ for file in ??g*; do echo $file; done
abg
degree
..g
Run Code Online (Sandbox Code Playgroud)