He estado trabajando en un script bash para buscar nombres de definiciones, y luego tomar los valores hexadecimales para ellos y ponerlos en la lista. Una vez que tenga la lista de nombres, intentaré buscar «#define [nombre]» usando -w para asegurar una coincidencia exacta, y luego awk «{print $ 3}» para tomar el valor hexadecimal.
Sin embargo, funciona si la línea en el archivo de encabezado es similar a
a.h:#define [name] 0x0001
Pero NO funciona si es similar a
a.h: #define [name] 0x0001
¿Cómo puedo solucionar esto? He probado esto
grep -nrw "\s*#define[[:space:]]*$p" . --include=*.h | awk "{ print $3 }"
Pensé que \s*
ignoraría el espacio en blanco inicial antes de #define
pero no» t. ¿Estoy haciendo algo mal?
Comentarios
Respuesta
Simplemente use awk
(usando grep
me parece redundante, ya que awk
ya puede coincidir con una expresión regular):
awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" *.h
Pasando la expresión con más detalle:
$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
Para que esto se ejecute de forma recursiva, p. ej.
dado que awk
necesita recibir una lista de archivos para operar, podría:
find . -type f -name "*.h" \ -exec awk "$0~/\s*\#define\s*\[.*\]\s*.*/ {print $3}" {} \; 0x0002 0x0003 0x0001
Comentarios
- ¿Esto también puede manejar recursivo? (comprobando * .h de los subdirectorios)
- Muy bien hecho, esto es increíble. Basándome en algunas sugerencias y pruebas, he encontrado que
grep -Ro '#define\s*\(.*\)' *.h
funciona. -o fue complicado obtener la línea completa, pero si le dices que incluya cualquier cosa que venga después, ahora puedo usar awk para obtener el elemento 3. ya que grep incluye el nombre del archivo de encabezado, si había un espacio antes de#define
lo estropearía.
Responder
Use grep -o
para imprimir solo la parte correspondiente de la línea.
Obviamente, quite la \s
de nuevo, porque no quiero esa parte.
Comentarios
- El problema es que con -o, ahora no ' t obtenga el valor hexadecimal, ya que solo captura
#define
y$p
-E
para usar\s
#define
se cambiará de $ 1 a $ 2