0

私はフォームでスクリプトを書いています

while read LINE 
do
    [[ $LINE =~ ^headertag1 ]] && function1 && continue
    [[ $LINE =~ ^headertag2 ]] && function2 && continue
    ...
done < filename

タグの数が増えると、1 行あたりのチェックが多すぎます。一般的なタグを上に並べ替えてみることはできますが、根本的な問題は解決しないと思います。私はソフトウェアエンジニアではありません。この状況を改善できるプログラミングの概念/方法はありますか?

4

3 に答える 3

1

はい、2つの場合、最初に両方の最長の共通プレフィックスを見つけることができます(ここでは、bashで2つの文字列の最長共通プレフィックスでそれを行う方法を疑問に思っていました)。次に、最初に行がそれで始まるかどうかを確認し、次にそれを削除した後タグと行の両方が、行が残りの部分で始まるかどうかをチェックします。

2 つ以上の場合は、トライを作成する必要があります — プレフィックス ツリーhttps://en.wikipedia.org/wiki/Trieとも呼ばれます。

そのウィキペディアの記事は言う

プレフィックス ツリーのスペースを最適化した表現については、コンパクト プレフィックス ツリーを参照してください。

そして、最も長い一般的な接頭辞を持つことは、あなたが持っているものです.

Bash には多次元連想配列がないため、 https://en.wikipedia.org/wiki/Trie#Implementation_strategiesを検討するか、Perl や Python などの他のスクリプト言語、または GNU Awk ( gawk) を埋め込む必要があります。は、標準の Awk とは異なり、多次元連想配列を導入しています

Bash の連想配列実装の最適化の使用

コメントで提案されているように、より単純な正規表現を使用してタグのみを取得し、それを Bash で多少最適化された連想配列のキーとして使用することを検討できます (ソースでニーズにどれだけ適しているかを調べることができます:

それが何で区切られているかを知っている場合—たとえば、それが含まれていないときに常にすぐに a:または何かが続くことがわかっている場合、および次のようなより単純な正規表現を使用します。

[[ $LINE =~ ^(.*): ]] && "${DICTIONARY_OF_FUNCTIONS["${BASH_REMATCH[1]}"]}"

または Bash の関数ストアの最適化を使用する

すべてのタグが似ている/[a-z][a-z0-9]+/か、そうでなければ Bash によって関数名として受け入れられ、Bash の連想配列を使用したメソッドのように区切られている場合、上記のメソッドを関数名の補間に使用できます。

function the_function_for_tag_headertag1() {
    echo "hey it's the first one"
}
[[ $LINE =! ^(.*): ]] && {
    func_name="the_function_for_tag_${BASH_REMATCH[1]}"
    type "${func_name}" && "${func_name}"
}
于 2019-11-08T09:28:44.410 に答える