Jag har arbetat med ett bash-skript för att söka efter namn på definier, och ta sedan hex-värdena för dem och lägg dem i listan. När jag väl har listan med namn kommer jag att försöka söka efter ”#define [name]” med -w för att säkerställa exakt matchning och sedan ”” skriva ut $ 3} ”för att fånga hex-värdet.
Men det fungerar om raden i rubrikfilen liknar
a.h:#define [name] 0x0001
Men den fungerar INTE om den liknar
a.h: #define [name] 0x0001
Hur kan jag komma runt detta? Jag har provat detta
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Jag trodde att \s*
skulle ignorera det ledande vita utrymmet innan #define
men det gör det inte. Gör jag något fel?
Kommentarer
- Jag tror att du måste använda utökad grep eller
-E
-flaggan för att använda\s
- Jag är, men jag tror att frågan kommer från ledande vitt utrymme som orsakar
#define
som ska flyttas från $ 1 till $ 2 - Du bör beskriva problemet bättre, det är svårt att förstå vad du vill uppnå.
Svar
Använd bara awk
(med grep
verkar överflödigt för mig eftersom awk
redan kan matcha ett reguljärt uttryck):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Går igenom uttrycket mer detaljerat:
$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
Att köra detta rekursivt, t.ex.
eftersom awk
måste ges en lista med filer för att fungera kan du:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Kommentarer
Svar
Använd grep -o
för att bara skriva ut den matchande delen av raden.
Ta självklart \s
delen igen, eftersom du inte vill ha den delen.
Kommentarer
- Problemet är att med -o, nu gör jag inte ' t få hex-värdet eftersom det bara tar tag i
#define
och$p
grep -Ro '#define\s*\(.*\)' *.h
fungerar. -o var knepigt att få hela raden men om du bara säger att den ska inkludera allt som kommer efter kan jag nu bara använda awk för att få element 3. eftersom grep innehåller rubrikens filnamn, om det fanns ett mellanslag före#define
det skulle förstöra det.