Jeg har jobbet med et bash-skript for å søke etter navn på definisjoner, og ta tak i hexverdiene for dem og legg dem Når jeg har listen over navn, vil jeg prøve å søke etter «#define [name]» ved å bruke -w for å sikre nøyaktig samsvar, og deretter «{print $ 3}» for å hente hexverdien.
Men det fungerer hvis linjen i toppfilen ligner på
a.h:#define [name] 0x0001
Men den fungerer IKKE hvis den ligner på
a.h: #define [name] 0x0001
Hvordan kan jeg komme meg rundt dette? Jeg har prøvd dette
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Jeg trodde \s*
ville ignorere det ledende hvite området før #define
men det gjør ikke det. Gjør jeg noe galt?
Kommentarer
- Jeg tror du må bruke utvidet grep eller
-E
flagget for å bruke\s
- Jeg er det, men jeg tror problemet kommer fra ledende hvite rom som forårsaker
#define
som skal skiftes fra $ 1 til $ 2 - Du bør beskrive problemet bedre, det er vanskelig å forstå hva du vil oppnå.
Svar
Bare bruk awk
(ved hjelp av grep
virker overflødig for meg, siden awk
allerede kan matche et vanlig uttrykk):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Går gjennom uttrykket mer detaljert:
$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
For å få dette til å løpe rekursivt, f.eks.
siden awk
trenger å få en liste over filer å operere på, kan du:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Kommentarer
Svar
Bruk grep -o
for å kun skrive ut den matchende delen av linjen.
Ta tydeligvis \s
delen ut igjen, fordi du ikke vil ha den delen.
Kommentarer
- Problemet er at med -o, nå gjør jeg ikke ' t få hexverdien siden den bare griper
#define
og$p
grep -Ro '#define\s*\(.*\)' *.h
fungerer. -o var vanskelig å få hele linjen, men hvis du bare ber den om å inkludere noe som kommer etter, kan jeg nå bare bruke awk for å få element 3. siden grep inkluderer header-filnavnet, hvis det var et mellomrom før#define
det ville ødelagt det.