0

フィルタリングしたい、生成されたレポートの長いリストがあります。レポートは次のようなものです。

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 はファイル名の後に両方を含む行を出力します。これは私が望むものです。

スクリプトは複数行の正規表現で動作し、指定されたフィルタリング条件が空の場合は結果を出力しません。

4

1 に答える 1