Tengo un script mycommand.sh
que no puedo ejecutar dos veces. Quiero dividir la salida en dos archivos diferentes: un archivo que contiene las líneas que coinciden con una expresión regular y un archivo que contiene las líneas que no coinciden con una expresión regular. Lo que deseo tener es básicamente algo como esto:
./mycommand.sh | grep -E 'some|very*|cool[regex].here;)' --match file1.txt --not-match file2.txt
Sé que puedo redirigir la salida a un archivo y luego a dos greps diferentes con y sin la opción -v y redirigir su salida a dos archivos diferentes. Pero me preguntaba si sería posible hacerlo con un grep.
Entonces, ¿es posible lograr lo que quiero en una sola línea?
fuente
w filename
- escribe el espacio del patrón actual en el nombre del archivo.Si desea que todas las líneas coincidentes vayan
file_1
y todas las líneas no coincidentesfile_2
, puede hacer lo siguiente:o
Explicación
/pattern/!{p;d};
/pattern/!
- negación - si una línea no contienepattern
.p
- imprime el espacio del patrón actual.d
- Eliminar el espacio del patrón. Comience el próximo ciclo.file_2
en nuestro caso. La siguiente parte delsed
script (w file_1
) no se alcanza mientras la línea no coincide con el patrón.w file_1
- si una línea contiene un patrón, la/pattern/!{p;d};
parte se omite (porque se ejecuta solo cuando el patrón no coincide) y, por lo tanto, esta línea va alfile_1
.fuente
file_1
yfile_2
se cambió al orden correcto.Me gustó la
sed
solución ya que no se basa en bashismos y trata los archivos de salida en el mismo pie. AFAIK, no existe una herramienta Unix independiente que haga lo que desea, por lo que necesitaría programarla usted mismo. Si abandonáramos el enfoque de la navaja suiza, podríamos usar cualquiera de los lenguajes de script (Perl, Python, NodeJS).Así es como se haría en NodeJS
Ejemplo de uso
fuente
Si no le importa el uso de Python y una sintaxis de expresión regular diferente:
Uso
Ejemplo
fuente