在bash中if条件中使用正则expression式
我不知道在bash中的if子句中使用正则expression式的一般规则?
这是一个例子
$ 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 $
为什么最后三个不匹配?
希望你能给出尽可能多的一般规则,而不仅仅是这个例子。
使用glob模式时,问号表示单个字符,星号表示零个或多个字符的序列:
if [[ $gg == ????grid* ]] ; then echo $gg; fi
使用正则expression式时,点表示单个字符,星号表示前面字符的零个或多个。 所以“ .*
”表示零个或多个字符,“ a*
”表示零个或多个“a”,“ [0-9]*
”表示零个或多个数字。 另一个有用的(在许多中)是代表一个或多个前面的字符的加号。 所以“ [az]+
”表示一个或多个小写字母字符(在C语言环境中 – 以及其他一些字符)。
if [[ $gg =~ ^....grid.*$ ]] ; then echo $gg; fi
使用=〜
用于正则expression式检查正则expression式教程目录
if [[ $gg =~ ^....grid.* ]]
为那些对更便携的解决scheme感兴趣的用户(不依赖于bash
版本)添加grep
和基本sh
内build的解决scheme;也可以在非Linux平台上使用简单的旧sh
,等等)
# 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
一些grep
化身也支持-q
(quiet)选项作为redirect到/dev/null
的替代scheme,但redirect又是最便携的。
@OP,
Is glob pettern not only used for file names?
不,“glob”模式不仅用于文件名。 你也可以使用它来比较string。 在你的例子中,你可以使用case / esac来查找string模式。
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
In bash, when to use glob pattern and when to use regular expression? Thanks!
正则expression式比“全局模式”更加通用和“方便”,但除非您正在执行的“混合/扩展匹配”无法轻松提供的复杂任务,否则不需要使用正则expression式。 正则expression式不支持版本的bash <3.2(如丹尼斯提到),但你仍然可以使用扩展的extglob
(通过设置extglob
)。 对于扩展globbing,请看这里和一些简单的例子。
更新OP:查找以2个字符开头的文件(点“。”表示1个字符),后跟“g”使用正则expression式
例如输出
$ shopt -s dotglob $ ls -1 * abg degree ..g $ for file in *; do [[ $file =~ "..g" ]] && echo $file ; done abg degree ..g
在上面,文件是匹配的,因为它们的名字包含2个字符,后面跟着“g”。 (即..g
)。
与globbing相当的将是这样的:(请参阅 ?
和*
含义的参考 )
$ for file in ??g*; do echo $file; done abg degree ..g