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
$ 1-ről $ 2-re kell áthelyezni
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
-E
zászlót a\s