grep + regex:データをコンテキスト要素と一致させるためのパターンを作成する方法は?

grep + regex:データをコンテキスト要素と一致させるためのパターンを作成する方法は?

テキスト(アセンブリコード)があるとします。

st.w    av,d15
ld.w    d15,av

我々はそれをgrepしたいと仮定しましょう。次のパターンを使用できます。

pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'

.*注:レジスタ名を一致させるために使用されます。これらのレジスタ名は将来変更される可能性があります。

レジスタ名に特別な正規表現を使用するとします。特別なキーワードを追加します@reg

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'

次に、すべての特殊キーワードを実際の正規表現パターンに置き換えるprepend関数をgrepパターンに追加します。

preprocess_pattern () {
    local result=$1
    # Replace @reg to exact regex pattern [a..d][0..15].
    result=${result//'@reg'/'[a-d](1[0-5]|[0-9])'}
    # Add other replacements (if need).
    #result=${result//''/''}
    echo "$result"
}

その後、preprocess_pattern()実行する前に呼び出しますgrep

pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
    echo "grep #$i failed (pattern: "$pattern")"
    ((++failed))
fi

うまくいきますが、私たちはもっと欲しいです。

@pregつまり、追加したいと思います。以前の登録

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'

今問題は、各発生後にロジックを追加する場所と方法です。@reg 救うd15特殊スタック/バッファの値と各発生後の値の一致(私たちの場合)@preg 探す@pregスタック/バッファの値を一致させますか?値と比較して値を確認します。

つまり、データに一致するパターンを作成する方法状況に合う要素?グレブは大丈夫ですか?

可能であれば(すなわち、可能であれば)これを説明する方法状況感度パターンとして?

そうでなければ(つまり不可能であれば)、この問題を解決するために何ができますか?

ベストアンサー1

達成することはおそらくgrep + regexを使って達成できますが、これは複雑です。あなたの仕事には、いくつかの言語の完全なスクリプトまたはプログラムが必要です。

さまざまなコマンドの特性に従うことが役に立ちます。

  1. Grepコンテキスト:grepが提供する唯一のコンテキストは、行数に一致する行before[ after、、、-A(最初の2つの組み合わせ)]です-B-C
  2. AwkとSed:これを使用すると、2つのパターン内でテキストを検索できます。

しかし、これも複雑になる可能性があります。私が理解しているように、あなたは一種のパーサーを書こうとしているので、複雑なコマンドを書く前にビルダーを調べて試してみる必要があります。

おすすめ記事