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

  • zvládne to také rekurzivní? (kontrola * .h z podadresářů)
  • Výborně, to je skvělé. Na základě několika návrhů a testování jsem zjistil, že 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.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *