テキスト(アセンブリコード)があるとします。
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を使って達成できますが、これは複雑です。あなたの仕事には、いくつかの言語の完全なスクリプトまたはプログラムが必要です。
さまざまなコマンドの特性に従うことが役に立ちます。
- Grepコンテキスト:grepが提供する唯一のコンテキストは、行数に一致する行
before
[after
、、、-A
(最初の2つの組み合わせ)]です-B
。-C
- AwkとSed:これを使用すると、2つのパターン内でテキストを検索できます。
しかし、これも複雑になる可能性があります。私が理解しているように、あなたは一種のパーサーを書こうとしているので、複雑なコマンドを書く前にビルダーを調べて試してみる必要があります。