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
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
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.