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

  • kan det här hantera rekursivt också? (kontrollera * .h från subdirs)
  • Mycket bra gjort, det här är fantastiskt. Baserat på några förslag och tester har jag funnit att 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.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *