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
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
-E
per utilizzare\s
#define
da spostare da $ 1 a $ 2