Egy bash szkripten dolgoztam, hogy megkeressem a definiációk nevét, majd megragadom a hexadecimális értékeket, és beteszem őket Miután megvan a névjegyzék, megkísérlem keresni a “#define [name]” szót a -w használatával a pontos egyezés biztosítása érdekében, majd awk “{print $ 3}” segítségével megragadom a hexaértéket.

De akkor működik, ha a fejlécfájl sora hasonló a

a.h:#define [name] 0x0001 

De NEM működik, ha hasonló a

a.h: #define [name] 0x0001 

Hogyan tudom ezt megkerülni? Ezt kipróbáltam

grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }" 

Úgy gondoltam, hogy a \s* figyelmen kívül hagyja a de nem” t. Valamit rosszul csinálok?

Megjegyzések

  • Úgy gondolom, hogy kiterjesztett grepet vagy a -E zászlót a \s
  • használatához, de úgy gondolom, hogy a probléma a fehér tér vezetéséből származik, div id = “09aa5f757f”>

$ 1-ről $ 2-re kell áthelyezni

  • Jobban le kell írnod a problémát, nehéz megérteni, mit szeretnél elérni.
  • Válasz

    Csak a awk parancsot használja (a grep feleslegesnek tűnik számomra, mivel a awk már megfelel egy szabályos kifejezésnek):

    awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h 

    a kifejezés részletesebben:

    $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 

    Ennek rekurzív futtatásához pl.

    mivel a awk számára meg kell adni a működni kívánt fájlok listáját, így tehetnéd:

    find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001 

    Megjegyzések

    • kezelheti ez rekurzív módon is? (* .h ellenőrzése alcsoportokból)
    • Nagyon jól sikerült, ez fantasztikus. Néhány javaslat és teszt alapján azt tapasztaltam, hogy a grep -Ro '#define\s*\(.*\)' *.h működik. -o volt bonyolult megszerezni a teljes sort, de ha csak azt mondod neki, hogy tartalmazzon bármit, ami utána következik, akkor most csak az awk-t használhatom a 3. elem megszerzéséhez. mivel a grep tartalmazza a fejléc fájlnevét, ha a #define elrontaná.

    Válasz

    Használja a grep -o csak a sor megfelelő részének kinyomtatásához.

    Nyilvánvalóan vegye ki újra a \s részt, mert nem “t” szeretném azt a részt.

    Megjegyzések

    • A probléma az, hogy az -o-val, most nem ' t kapja meg a hexa értéket, mivel csak #define és $p

    megragadja

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük