
現在、Bash で一連のユニット/統合テストを実行できるスクリプトを作成しようとしています。その部分は機能していますが、今必要なのは、最後に要約を出力できるようにすることです。grep
数字とそれに続く文字列を含むすべての行を取得し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]+
1 つ以上の数字と一致します。パターンを拡張正規表現として解釈する-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}
量指定子は 1 つ以上の数字を一致させるために使用されます。中括弧に特別な意味を与えるには、バックスラッシュが必要です。