2008/05/27

正規表示法 regular expressions for bash

bash regular expressions

這篇主要算是翻譯自上面的文章。一般在寫 shell script 時,比對字串通常用的是 grep, sed, cut,col 等等工具,但是 Bash 較新的版本其實內建正規表示法運算子 =~ 可供使用,這有點像 perl, 但是又可以不必把龐大的 Perl 包裝進去。

因為正規表示法的比對是多匹配的,匹配結果放在 BASH_REMATCH 這個環境陣列變數中,整體結果放 BASH_REMATCH[0], 第一個匹配樣式放 BASH_REMATCH[1].....

直接給範例比較簡單:


#!/bin.bash
# saved as bashre.sh
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 'aa(b{2,3}[xyz])cc' aabbxcc aabbcc
regex: aa(b{2,3}[xyz])cc

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

0 意見: