
我目前正在嘗試在 Bash 中編寫一個可以運行一組單元/整合測試的腳本。我已經完成了該部分的工作,但我現在需要的是能夠在最後輸出一個摘要。我一直在嘗試使用grep
ot 抓取包含數字後跟字串的每一行failing
,將其保存在變數中,然後在最後列印。
因此,失敗輸出的一個例子是
224 passing (3m)
47 failing
我想在最後印的是類似的內容
service01 4 failing
service03 1 failing
到目前為止我所擁有的是:
OUTPUT=""
for service in ${array[*]}
do
echo $service
if [ $DO_API == 'true' ]
then
echo 'running API tests'
OUTPUT+="$service API $(docker exec -it $service npm run api_test | tee /dev/tty | grep -e '[0-9]+ failing' )"
fi
if [ $DO_CI == 'true' ]
then
echo 'running CI tests'
OUTPUT+="$service CI $(docker exec -it $service npm run ci | tee /dev/tty | grep -e '[0-9]+ failing' )"
fi
echo $'\n'
done
當測試失敗時,上面的腳本沒有顯示任何輸出,這讓我相信這是我的 grep 語法錯誤。
我究竟做錯了什麼?
答案1
以下grep
命令將返回所需的輸出:
grep -E '[0-9]+ failing'
此模式[0-9]+
匹配一個或多位數字。-E
必須使用該選項才能grep
將模式解釋為擴展正規表示式。量詞+
未定義為基本正規表示式的一部分。
範例運行(使用檔案):
$ cat testfile
224 passing (3m)
47 failing
$ grep -E '[0-9]+ failing' testfile
47 failing
順便說一句,該模式還可以使用基本正規表示式(BRE)以下列方式實現:
$ grep '[0-9]\{1,\} failing' testfile
47 failing
在這種情況下,{n,m}
量詞用於匹配一個或多個數字。需要反斜線來賦予花括號特殊的意義。