Ik “heb aan een bash-script gewerkt om namen van defines te zoeken, en pak dan de hexadecimale waarden ervoor en plaats ze in de lijst. Zodra ik de lijst met namen heb, zal ik proberen te zoeken naar “#define [name]” met -w om een exacte overeenkomst te garanderen, en dan awk “{print $ 3}” om de hexadecimale waarde te pakken.
Het werkt echter als de regel in het headerbestand vergelijkbaar is met
a.h:#define [name] 0x0001
Maar het werkt NIET als het vergelijkbaar is met
a.h: #define [name] 0x0001
Hoe kan ik dit omzeilen? Ik heb dit geprobeerd
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Ik dacht dat de \s*
de eerste witruimte zou negeren vóór #define
maar dat doet het niet. Doe ik iets verkeerd?
Reacties
- Ik denk dat je uitgebreide grep of de
-E
vlag om te gebruiken\s
- Dat ben ik, maar ik denk dat het probleem wordt veroorzaakt door leidende witruimte die
#define
wordt verschoven van $ 1 naar $ 2 - Je moet het probleem beter beschrijven, het is moeilijk te begrijpen wat je wilt bereiken.
Antwoord
Gebruik gewoon awk
(gebruik grep
lijkt mij overbodig, aangezien awk
al een reguliere expressie kan matchen):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
de uitdrukking in meer 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
Om dit recursief te laten draaien, bijv.
aangezien awk
een lijst met bestanden nodig heeft om mee te werken, kunt u:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Reacties
Antwoord
Gebruik grep -o
om alleen het overeenkomende deel van de regel af te drukken.
Het is duidelijk dat het \s
deel er weer uit moet worden gehaald, want wil dat deel.
Reacties
- Het probleem is dat met -o, nu ik ' t haal de hexadecimale waarde op aangezien deze alleen
#define
en$p
pakt
grep -Ro '#define\s*\(.*\)' *.h
werkt. -o was lastig om de hele regel te krijgen, maar als je het gewoon vertelt om alles op te nemen dat erna komt, kan ik nu gewoon awk gebruiken om element 3 te krijgen, aangezien grep de header-bestandsnaam bevat, als er een spatie voor#define
het zou het verpesten.