¿Cómo buscar muchos archivos con expresiones regulares y coincidencias de salida con líneas en un nuevo archivo?

2

Tengo miles de archivos fuente y me gustaría encontrar todo el texto que coincida con una expresión regular y luego mostrar cada coincidencia en su propia línea en un archivo de texto resultante.

Por ejemplo;

// a.cs
string test = _.Text("Hello World!") + _.Text("Foo");
// b.cs
Debug.Log(_.ActionText("Bar"));

// results.txt
_.Text("Hello World")
_.Text("Foo")
_.ActionText("Bar")

¿Qué comando sería capaz de lograr esto? ¿podría por favor mostrar un ejemplo?

Lea Hayes
fuente
2
Si sus grepapoyos -o, ese sería el mejor candidato.
muru

Respuestas:

3
sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt

... probablemente funcionaría. Ejecute en sus datos de ejemplo que imprime:

_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")

Todo lo que hace es intentar encerrar la primera coincidencia en una línea en \newlines. Si tiene éxito o no, Delige hasta la primera línea de \newline en el espacio del patrón, lo que para una línea que no coincide lo elimina por completo de la salida, pero para una coincidencia se elimina solo hasta la cabeza de su patrón y el script comienza de nuevo desde la parte superior . Si una línea \new coincide con el espacio del patrón, lo que solo puede suceder si se encontró una coincidencia y luego se Deligió, entonces sedimprime solo hasta la primera línea \new en el espacio del patrón, que se encuentra en la cola de la cadena coincidente. La s///sustitución !no se intenta cuando ya hay una línea \nelectrónica en el espacio del patrón, por lo queDEl comando elete borra la coincidencia ya impresa y el ciclo comienza nuevamente desde la cola de la última coincidencia.

Sin embargo, dependiendo de tu, sedes posible que necesites usar una línea \nelectrónica literal en lugar del ncampo de sustitución del lado derecho. Pero debería poder hacer todos los argumentos del archivo a la vez, o, al menos, muchos a la vez (dependiendo de los límites de ARGMAX) . Puede simplemente bombardear esos, o tal vez hacer ...

find /path -name pattern -exec sed script_above {} + >>results.txt

... porque sedtratará todos los archivos de entrada como una sola secuencia.

mikeserv
fuente
Fui con el findenfoque y funcionó perfectamente; ¡Gracias!
Lea Hayes
@LeaHayes, estoy muy contento de saberlo, y gracias por los comentarios.
mikeserv
0

Puedes usar grep.

grep -Eo '_\.\w+\("[^"]+"\)'
azzid
fuente