Am lucrat la un script bash pentru a căuta numele definițiilor, apoi apuc valorile hexagonale pentru ele și le pun în listă. Odată ce am lista de nume, voi încerca să caut „#define [name]” folosind -w pentru a asigura potrivirea exactă, apoi apelați „{print $ 3}” pentru a obține valoarea hex.
Cu toate acestea funcționează dacă linia din fișierul antet este similară cu
a.h:#define [name] 0x0001
Dar NU funcționează dacă este similară cu
a.h: #define [name] 0x0001
Cum pot evita acest lucru? Am încercat acest lucru
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Am crezut că \s*
va ignora spațiul alb principal înainte de #define
dar nu este. Fac ceva greșit?
Comentarii
- Cred că trebuie să folosești grep extins sau steagul
-E
pentru a utiliza\s
- sunt, dar cred că problema provine din conducerea spațiului alb care cauzează
#define
să fie mutat de la $ 1 la $ 2 - Ar trebui să descrieți mai bine problema, este greu să înțelegeți ce doriți să realizați.
Răspuns
Folosește doar awk
(folosind grep
mi se pare redundant, întrucât awk
deja poate corespunde unei expresii regulate):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
expresia mai detaliată:
$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
Pentru a rula acest lucru recursiv, de ex.
deoarece awk
trebuie să primească o listă de fișiere pentru a opera, puteți:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Comentarii
Răspuns
Utilizați grep -o
pentru a imprima doar partea potrivită a liniei.
Evident scoateți din nou partea \s
, deoarece nu faceți acest lucru doresc acea parte.
Comentarii
- Problema este că cu -o, acum nu ' t obțineți valoarea hexagonală, deoarece apucă numai
#define
și$p
grep -Ro '#define\s*\(.*\)' *.h
funcționează. -o a fost dificil pentru a obține întreaga linie, dar dacă îi spui să includă tot ce vine după, acum pot folosi doar awk pentru a obține elementul 3. deoarece grep include numele fișierului antet, dacă a existat un spațiu înainte de#define
ar încurca.