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

  • Est-ce que cela peut également gérer récursivement? (vérification * .h des sous-répertoires)
  • Très bien fait, cest génial. Sur la base de quelques suggestions et tests, jai trouvé que 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.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *