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

  • se poate descurca și acest lucru recursiv? (verificând * .h din subdirecte)
  • Foarte bine, este minunat. Pe baza unor sugestii și testări, am constatat că 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.

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *