Escriba un script que genere el nombre de archivo y el número de lino que contenga cierto texto

2

¿Cómo puedo escribir un script (bash) que analice todos los archivos .tex en una carpeta para detectar la aparición de \todo, Y emite el nombre de archivo y LineNumber donde se produce?

Lo que tengo hasta ahora:

#!/bin/bash
for texfile in *.tex ; do
  **Scan for \todo**
  **output $textfile$ , linenumber**
done

Quiero estar seguro de que mis archivos .tex no contienen \todo{sometext} cuando los entrego

No tiene que ser bash, solo lo elegí por simplicidad. Grep etc. sin duda sería bienvenido.

bjornasm
fuente
1
¿Qué es el "número de archivo"? ¿Número de archivos coincidentes o inodo o número de enlaces duros?
Cyrus
Lo sentimos, el número de archivo debe ser un nombre de archivo, lo editaré de inmediato.
bjornasm
Está bien, no hay problema.
Cyrus
1
¿Debe ser bash? Me gustaría tratar con grep para encontrar el todo y la tubería que aunque wc -l
Hennes
1
Puede el \todo{} abarcar varias líneas? Si no, es trivial eliminarlos automáticamente.
terdon

Respuestas:

4

grep puede hacerlo por sí mismo, puede envolverlo en un script si es necesario:

grep -nr '\todo' *.tex

-r para recursivo -n para visualizar el número de línea en el archivo

Por defecto, grep mostrará la línea que contiene la coincidencia. Para algunos formatos, esto puede significar mucha salida. Si desea restringir la salida de modo que solo obtenga la coincidencia y algunos caracteres a cada lado, use esto:

egrep -nor '.{0,20}\\todo.{0,20}'  *.tex

los -o significa "solo mostrar resultados coincidentes", sin embargo, esto solo mostraría \todo. Para obtener algo de contexto, permitimos cualquier cantidad de caracteres de hasta 20 en cualquier lado de la partida. los . coincide con cualquier cosa, y el {0,20} Repite este partido hasta 20 caracteres.

Paul
fuente
¡Gracias! ¿Hay una manera de no mostrar todo el párrafo donde está \ todo?
bjornasm
1
@bjornasm Ver adiciones en respuesta.
Paul