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

  • Kan dit ook recursief aan? (check * .h van subdirs)
  • Heel goed gedaan, dit is geweldig. Op basis van enkele suggesties en testen heb ik ontdekt dat 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.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *