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'

次に、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スタック/バッファから一致した値を取り出し、この値を?の値と比較します。

言い換えれば、データとマッチングするためのパターンをどのように記述するか状況に応じた要素ですか? grep で可能ですか?

もしそうなら(つまり可能であれば)、これをどのように説明するか文脈の敏感さパターンでは?

いいえ(つまり不可能)の場合、他にどのようにしてこの課題を解決するのでしょうか?

答え1

あなたが達成しようとしていることは、grep + regex で達成できるかもしれませんが、それは複雑になります。あなたのタスクには、本格的なスクリプトまたは何らかの言語で書かれたプログラムが必要です。

さまざまなコマンドの以下の機能は役に立つ

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

しかし、これもまた複雑になります。私の理解では、何らかのパーサーを作成しようとしているので、複雑なコマンドの作成に取り掛かる前に、書き込みツールを調べて使用してみる必要があります。

関連情報