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

  • Creo que necesitas usar grep extendido o el indicador -E para usar \s
  • Lo soy, pero creo que el problema proviene de un espacio en blanco inicial que causa #define se cambiará de $ 1 a $ 2
  • Debe describir mejor el problema, es difícil entender qué es lo que desea lograr.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *