Olen työskennellyt bash-komentosarjan parissa etsimään määritysten nimiä ja tarttunut niiden hex-arvoihin ja laittanut ne Kun minulla on luettelo nimistä, yritän hakea ”#define [name]” -w -näppäimellä tarkan vastaavuuden varmistamiseksi ja sitten awk ”{print $ 3}” tarttuaksesi heksadesimaaliarvoon.
Se toimii kuitenkin, jos otsikkotiedoston rivi on samanlainen kuin
a.h:#define [name] 0x0001
Mutta se EI toimi, jos se on samanlainen kuin
a.h: #define [name] 0x0001
Kuinka voin kiertää tämän? Olen kokeillut tätä
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Luulin, että \s*
jättää huomiotta johtavan välilyönnin ennen #define
mutta se ei” t. Teenkö jotain väärin?
Kommentit
Vastaa
Käytä vain awk
(käytä grep
näyttää tarpeettomalta, koska awk
voi jo täyttää säännöllisen lausekkeen):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Käynnissä lauseke tarkemmin:
$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
Jotta tämä suoritettaisiin rekursiivisesti, esim.
koska awk
on annettava luettelo tiedostoista, joita voidaan käyttää, voit:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
kommentit
- voiko tämä käsitellä myös rekursiivisia? (tarkistaa * .h aliryhmistä)
- Hyvin tehty, tämä on mahtavaa. Joidenkin ehdotusten ja testauksen perusteella olen huomannut, että
grep -Ro '#define\s*\(.*\)' *.h
toimii. -o oli hankalaa saada koko rivi, mutta jos vain sanot sen sisällyttävän kaikki mitä seuraa, voin nyt käyttää awk: tä saadaksesi elementin 3. koska grep sisältää otsikkotiedoston nimen, jos ennen#define
se sekaisin.
Vastaa
Käytä grep -o
tulostaaksesi vain rivin vastaavan osan.
Ota tietysti \s
-osa uudelleen ulos, koska et t haluavat sen osan.
Kommentit
- Ongelma on, että -o: n kanssa, nyt en ' t hanki heksadesimaaliarvo, koska se tarttuu vain
#define
ja$p
-E
-lippu käyttämään\s
#define
siirretään dollarista 1 dollariin