
Angenommen, es gibt einen Text (Assemblercode)
st.w av,d15
ld.w d15,av
Angenommen, wir möchten es mit grep abgleichen. Wir können dieses Muster verwenden:
pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'
Hinweis: Wir verwenden .*
zum Abgleichen der Registernamen. In Zukunft können sich diese Registernamen ändern.
Angenommen, wir möchten spezielle reguläre Ausdrücke für Registernamen verwenden. Wir fügen ein spezielles @reg
Schlüsselwort hinzu:
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'
Dann fügen wir eine präpossessive Funktion für das Grep-Muster hinzu, in der wir alle speziellen Schlüsselwörter durch echte Regex-Muster ersetzen:
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"
}
Dann rufen wir preprocess_pattern()
vor der Ausführung auf grep
:
pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
echo "grep #$i failed (pattern: "$pattern")"
((++failed))
fi
Es funktioniert, aber wir wollen mehr.
Wir möchten hinzufügen @preg
, und zwarvorheriges Register.
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'
Nun die Frage: wo (und wie) wird die Logik hinzugefügt, die nach jedem Auftreten von@reg
spartder übereinstimmende Wert (in unserem Fall d15
) im speziellen Stapel / Puffer und nach jedem Auftreten des@preg
ruft abden übereinstimmenden Wert aus dem Stapel/Puffer und vergleicht diesen Wert mit dem Wert des @preg
?
Mit anderen Worten: Wie schreibt man ein Muster zum Abgleichen von Daten mitkontextsensitivElemente? Ist das mit grep überhaupt möglich?
Wenn ja (also möglich), wie soll ich das beschreiben?Kontextsensitivitätim Muster?
Wenn nein (d. h. unmöglich), wie kann diese Herausforderung sonst gelöst werden?
Antwort1
Was Sie erreichen möchten, lässt sich möglicherweise mit grep + regex erreichen, aber das wird kompliziert. Ihre Aufgabe erfordert ein vollwertiges Skript oder ein Programm in einer bestimmten Sprache.
Die folgenden Funktionen verschiedener Befehle können hilfreich sein
- Grep-Kontext: Der einzige Kontext, den Grep bereitstellt, ist die Anzahl der Zeilen
before
undafter
eine übereinstimmende Zeile [-A
,-B
,-C
(Kombination der beiden vorherigen)] - Awk und Sed: Damit können Sie nach Text innerhalb von zwei Mustern suchen.
Aber auch das wird kompliziert. So wie ich es verstehe, versuchen Sie, einen Parser irgendeiner Art zu schreiben. Sie sollten sich also informieren und versuchen, das Schreibtool zu verwenden, bevor Sie sich an das Schreiben komplizierter Befehle machen.