Pracoval jsem na bash skriptu pro hledání názvů definic, pak pro ně uchopte hexadecimální hodnoty a vložte je v seznamu. Jakmile budu mít seznam jmen, pokusím se vyhledat „#define [name]“ pomocí -w k zajištění přesné shody a poté awk „{print $ 3}“ chytit hexadecimální hodnotu.
Funguje to však, pokud je řádek v souboru záhlaví podobný
a.h:#define [name] 0x0001
Ale nefunguje, pokud je podobný
a.h: #define [name] 0x0001
Jak to mohu obejít? Vyzkoušel jsem to
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Myslel jsem, že \s*
bude ignorovat přední mezery před #define
ale nedělá to. Dělám něco špatně?
Komentáře
- Myslím, že musíte použít rozšířený grep nebo příznak
-E
k použití\s
- jsem, ale domnívám se, že problém pochází z předního mezery způsobující
#define
má být přesunut z $ 1 na $ 2 - Problém byste měli popsat lépe, je těžké pochopit, čeho chcete dosáhnout.
Odpověď
Stačí použít awk
(pomocí grep
se mi zdá nadbytečný, protože awk
se již může shodovat s regulárním výrazem):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Procházet výraz podrobněji:
$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
Chcete-li, aby bylo toto spuštění rekurzivní, např.
vzhledem k tomu, že awk
je třeba získat seznam souborů, se kterými můžete pracovat, můžete:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Komentáře
Odpovědět
Použít grep -o
vytisknout pouze odpovídající část řádku.
Je zřejmé, že \s
část znovu vyjmete, protože ji nepoužíváte chci tu část.
Komentáře
- Problém je v tom, že s -o nyní nemám ' t získejte hexadecimální hodnotu, protože chytne pouze
#define
a$p
grep -Ro '#define\s*\(.*\)' *.h
funguje. -o bylo složité získat celý řádek, ale pokud mu řeknete, aby zahrnoval cokoli, co následuje, mohu nyní použít awk k získání prvku 3. protože grep obsahuje název souboru záhlaví, pokud před#define
poškodilo by to.