Bash 正则表达式

作者:Mitch Frazier

在 shell 脚本中使用正则表达式时,通常使用 grepsed 或其他外部命令/程序。自从 bash 的第 3 版(2004 年发布)以来,还有另一种选择:bash 的内置正则表达式比较运算符 "=~"。

Bash 的正则表达式比较运算符左侧接受一个字符串,右侧接受一个扩展的正则表达式。如果正则表达式与字符串匹配,则返回 0(成功),否则返回 1(失败)。

除了进行简单匹配之外,bash 正则表达式还支持用括号括起来的子模式,用于捕获匹配的部分。匹配项被分配给一个数组变量BASH_REMATCH。整个匹配项被分配给BASH_REMATCH[0],第一个子模式被分配给BASH_REMATCH[1],等等。

以下示例脚本将一个正则表达式作为其第一个参数,并将一个或多个字符串进行匹配。然后,它循环遍历字符串并输出匹配过程的结果

#!/bin.bash

if [[ $# -lt 2 ]]; then
    echo "Usage: $0 PATTERN STRINGS..."
    exit 1
fi
regex=$1
shift
echo "regex: $regex"
echo

while [[ $1 ]]
do
    if [[ $1 =~ $regex ]]; then
        echo "$1 matches"
        i=1
        n=${#BASH_REMATCH[*]}
        while [[ $i -lt $n ]]
        do
            echo "  capture[$i]: ${BASH_REMATCH[$i]}"
            let i++
        done
    else
        echo "$1 does not match"
    fi
    shift
done

假设脚本保存在“bashre.sh”中,以下示例显示其输出

  # sh bashre.sh 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc
  regex: aa(b{2,3}[xyz])cc

  aabbxcc matches
    capture[1]: bbx
  aabbcc does not match

Mitch Frazier 是 Emerson Electric Co. 的一名嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是Linux Journal 的贡献者和朋友。

加载 Disqus 评论