Bash 正则表达式
于 2008年5月26日
在 shell 脚本中使用正则表达式时,通常使用 grep 或 sed 或其他外部命令/程序。自从 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