Jai travaillé sur un script bash pour rechercher les noms des définitions, puis récupérer les valeurs hexadécimales pour eux et les mettre dans la liste. Une fois que jaurai la liste des noms, jessaierai de rechercher « #define [nom] » en utilisant -w pour assurer la correspondance exacte, puis awk « {print $ 3} » pour saisir la valeur hexadécimale.
Cependant, cela fonctionne si la ligne du fichier den-tête est similaire à
a.h:#define [name] 0x0001
Mais cela ne fonctionne PAS si elle est similaire à
a.h: #define [name] 0x0001
Comment puis-je contourner ce problème? Jai essayé ceci
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Je pensais que \s*
ignorerait le premier espace avant #define
mais ce nest pas le cas. Est-ce que je fais quelque chose de mal?
Commentaires
- Je pense que vous devez utiliser grep étendu ou lindicateur
-E
pour utiliser\s
- Je le suis, mais je crois que le problème vient du premier espace blanc causant
#define
pour passer de 1 $ à 2 $ - Vous devriez mieux décrire le problème, il est difficile de comprendre ce que vous voulez réaliser.
Réponse
Il suffit dutiliser awk
(en utilisant grep
me semble redondant, car awk
peut déjà correspondre à une expression régulière):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
En cours lexpression plus en détail:
$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
Pour avoir cette exécution récursive, par exemple
étant donné que awk
doit recevoir une liste de fichiers sur lesquels opérer, vous pouvez:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Commentaires
Réponse
Utilisez grep -o
pour nimprimer que la partie correspondante de la ligne.
Évidemment, retirez à nouveau la partie \s
, car vous ne le faites pas veulent cette partie.
Commentaires
- Le problème est quavec -o, maintenant je ne ' t obtenir la valeur hexadécimale car elle ne saisit que
#define
et$p
grep -Ro '#define\s*\(.*\)' *.h
fonctionne. -o était difficile dobtenir la ligne entière mais si vous lui dites simplement dinclure tout ce qui vient après, je peux maintenant simplement utiliser awk pour obtenir lélément 3. puisque grep inclut le nom du fichier den-tête, sil y avait un espace avant#define
ça gâcherait.