Ich habe an einem Bash-Skript gearbeitet, um nach Namen von Definitionen zu suchen, dann die Hex-Werte für sie zu greifen und sie zu setzen Sobald ich die Liste der Namen habe, werde ich versuchen, mit -w nach „#define [name]“ zu suchen, um eine genaue Übereinstimmung sicherzustellen, und dann mit „{print $ 3}“ den Hex-Wert ermitteln.
Es funktioniert jedoch, wenn die Zeile in der Header-Datei
a.h:#define [name] 0x0001
ähnelt. Es funktioniert jedoch NICHT, wenn sie p ähnelt >
a.h: #define [name] 0x0001
Wie kann ich das umgehen? Ich habe dies versucht
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Ich dachte, die \s*
würde das führende Leerzeichen vor aber nicht“ Tue ich etwas falsch?
Kommentare
- Ich denke, Sie müssen erweitertes grep oder verwenden das
-E
-Flag zur Verwendung von\s
- Ich bin es, aber ich glaube, das Problem kommt von führenden Leerzeichen, die
#define
von $ 1 auf $ 2 verschoben werden - Sie sollten das Problem besser beschreiben, es ist schwer zu verstehen, was Sie erreichen möchten.
Antwort
Verwenden Sie einfach awk
(mit grep
erscheint mir überflüssig, da awk
bereits mit einem regulären Ausdruck übereinstimmen kann):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Durchlaufen den Ausdruck im Detail:
$0 ~ /regexp/ # look for the regular expression in the record \s* # whitespace, any number of times \#define # literal string, "#" has to be scaped \s* # same as above .* # any character, any number of times, this is # your hex code and you can refine the regex here { print $3 } # print the third field if the record matches
Damit dies rekursiv ausgeführt wird, z. B.
Da awk
eine Liste der Dateien erhalten muss, mit denen gearbeitet werden soll, können Sie:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Kommentare
- Kann dies auch rekursiv sein? (Überprüfung von * .h aus Unterverzeichnissen)
- Sehr gut gemacht, das ist großartig. Aufgrund einiger Vorschläge und Tests habe ich festgestellt, dass
grep -Ro '#define\s*\(.*\)' *.h
funktioniert. -o war schwierig, die gesamte Zeile abzurufen, aber wenn Sie nur sagen, dass sie alles enthalten soll, was danach kommt, kann ich jetzt einfach awk verwenden, um Element 3 abzurufen. da grep den Namen der Header-Datei enthält, wenn vor#define
es würde es vermasseln.
Antwort
Verwenden Sie grep -o
, um nur den passenden Teil der Zeile zu drucken.
Nehmen Sie den Teil \s
offensichtlich wieder heraus, da Sie dies nicht tun möchte diesen Teil.
Kommentare
- Problem ist, dass ich mit -o jetzt nicht ' t Rufen Sie den Hex-Wert ab, da nur
#define
und$p
erfasst werden