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

  • Luulen, että sinun on käytettävä laajennettua grepiä tai -E -lippu käyttämään \s
  • olen, mutta uskon, että ongelma tulee johtamalla tyhjää tilaa, joka aiheuttaa #define siirretään dollarista 1 dollariin
  • Kuvaile ongelmaa paremmin, on vaikea ymmärtää, mitä haluat saavuttaa.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *