Jeg har arbejdet på et bash-script for at søge efter navne på definer, og tag derefter hex-værdierne for dem og læg dem på listen. Når jeg først har listen over navne, vil jeg forsøge at søge efter “#define [name]” ved hjælp af -w for at sikre nøjagtigt match, og derefter awk “{print $ 3}” for at få fat i hex-værdien.

Det fungerer dog, hvis linjen i headerfilen ligner

a.h:#define [name] 0x0001 

Men den fungerer IKKE, hvis den ligner

a.h: #define [name] 0x0001 

Hvordan kan jeg komme omkring dette? Jeg har prøvet dette

grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }" 

Jeg troede, at \s* ville ignorere det førende hvide område før #define men det gør det ikke. Gør jeg noget forkert?

Kommentarer

  • Jeg tror, du skal bruge udvidet grep eller -E -flagget til at bruge \s
  • Jeg er, men jeg tror, problemet kommer fra førende hvidt rum, der forårsager #define skal skiftes fra $ 1 til $ 2
  • Du bør beskrive problemet bedre, det er svært at forstå, hvad du vil opnå.

Svar

Brug bare awk (ved hjælp af grep virker overflødig for mig, da awk allerede kan matche et regulært udtryk):

awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h 

Går igennem udtrykket mere detaljeret:

$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 

At få dette til at køre rekursivt, f.eks.

da awk skal gives en liste over filer til at fungere på, kan du:

find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001 

Kommentarer

  • kan dette også håndtere rekursivt? (kontrollerer * .h fra underordninger)
  • Meget godt klaret, dette er fantastisk. Baseret på nogle forslag og test har jeg fundet ud af, at grep -Ro '#define\s*\(.*\)' *.h fungerer. -o var vanskelig at få hele linjen, men hvis du bare fortæller den at inkludere alt, hvad der kommer efter, kan jeg nu bare bruge awk til at få element 3. da grep inkluderer header-filnavnet, hvis der var et mellemrum før #define det ville ødelægge det.

Svar

Brug grep -o for kun at udskrive den matchende del af linjen.

Tag selvfølgelig \s -delen ud igen, fordi du ikke ønsker den del.

Kommentarer

  • Problemet er, at med -o, nu donerer jeg ikke ' t få den hex-værdi, da den kun griber #define og $p

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *