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

  • kan dette håndtere rekursivt også? (sjekker * .h fra underordninger)
  • Veldig bra gjort, dette er kjempebra. Basert på noen forslag og testing har jeg funnet ut at 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.

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *