フィルタリングしたい、生成されたレポートの長いリストがあります。レポートは次のようなものです。
Report Name
Report Date
Blah blah blah
Parameter1: 85.34%
Blah blah
Paramter2 FF_6
Parameter3: 345
Parameter4: value
blah blah
OutputVar1: 98.34%
OutputVar2: 345
blah blah
Output Var3:
45, 34, 178
blah blah
現在、(必要なパラメーターで) 条件を取得し、必要な出力変数の行をファイル名自体と共に出力するシェル スクリプトを作成しようとしています。これを達成するために、私は and を使用ag
してregex
います。レポートをフィルタリングして目的の行を出力する、次のようなスクリプトを作成しようとしています。
#!/bin/sh
# Script Name: FilterResults
# Purpose: Search through report directory (txt files) and put the desired output from all files which have the condition.
# Usage Example:
# FlterReports OutputPattern FilterCondition1 FilterCondition2 FilterCondition3
case "$#" in
1)
ag "$1"
;;
2)
ag "$1" $(ag -l "$2")
;;
3)
#ag "(?s)^(?=.*$2)(?=.*$3).*\n\K(?-s).*($1)"
ag $1 $(ag -l "(?s)^(?=.*$2)(?=.*$3)")
;;
4)
ag $1 $(ag -l "(?s)^(?=.*$2)(?=.*$3)(?=.*$4)")
;;
esac
このスクリプトは何とか機能しますが、3 つの単語を一致させようとするとケース 4 で問題が発生します。また、別の問題は、フィルター条件がファイルを返さない場合です。この場合、スクリプトは (何もしないのではなく) すべてのファイルの目的の出力値を出力します。
1 つの複雑なケースの例は次のとおりです。
> FilterResults "(Accuracy:)|Fold:" "algName:.*RCPB" "Radius:.*8" "approach:.*DD_4"
「Accuracy」と「Fold」は、出力に配置する目的の出力です。また、ag のデフォルトの動作である、一致するファイル名も同様に使用したいと考えています。このパターン、つまり「Val1|Val2」を使用すると、ag はファイル名の後に両方を含む行を出力します。これは私が望むものです。
スクリプトは複数行の正規表現で動作し、指定されたフィルタリング条件が空の場合は結果を出力しません。