Ho lavorato su uno script bash per cercare i nomi delle definizioni, quindi prendi i valori esadecimali per loro e inseriscili nellelenco. Una volta ottenuto lelenco dei nomi, cercherò di cercare “#define [nome]” utilizzando -w per garantire la corrispondenza esatta, quindi awk “{print $ 3}” per acquisire il valore esadecimale.

Tuttavia funziona se la riga nel file di intestazione è simile a

a.h:#define [name] 0x0001 

Ma NON funziona se è simile a

a.h: #define [name] 0x0001 

Come posso aggirare questo problema? Ho provato

grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }" 

Pensavo che \s* ignorasse lo spazio bianco iniziale prima di #define ma” t. Sto facendo qualcosa di sbagliato?

Commenti

  • Penso che tu debba usare grep esteso o il flag -E per utilizzare \s
  • Sì, ma credo che il problema derivi dallo spazio bianco iniziale che causa #define da spostare da $ 1 a $ 2
  • Dovresti descrivere meglio il problema, è difficile capire cosa vuoi ottenere.

Risposta

Usa semplicemente awk (usando grep mi sembra ridondante, poiché awk può già trovare una corrispondenza con unespressione regolare):

awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h 

Continuare lespressione in modo più dettagliato:

$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 

Per eseguire questa operazione in modo ricorsivo, ad esempio

poiché awk deve ricevere un elenco di file su cui operare, potresti:

find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001 

Commenti

  • può gestire anche la ricorsività? (controllando * .h dalle sottodirectory)
  • Molto ben fatto, è fantastico. Sulla base di alcuni suggerimenti e test, ho scoperto che grep -Ro '#define\s*\(.*\)' *.h funziona. -o è stato difficile ottenere lintera riga ma se gli dici semplicemente di includere tutto ciò che viene dopo, ora posso semplicemente usare awk per ottenere lelemento 3. poiché grep include il nome del file di intestazione, se cera uno spazio prima di #define rovinerebbe tutto.

Risposta

Usa grep -o per stampare solo la parte corrispondente della riga.

Ovviamente togli di nuovo la parte \s, perché non “t voglio quella parte.

Commenti

  • Il problema è che con -o, ora non ' t ottieni il valore esadecimale poiché acquisisce solo #define e $p

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *