
Necesito usar expresiones regulares para eliminar todo el texto que comienza al final de la línea y retrocede dos puntos.
gtk2-2.24.22-2.fc20.x86_64
se convierte
gtk2-2.24.22-2
Esta es la salida de rpm -qa
un archivo de texto y necesito cortar el final.
Respuesta1
Túnecesidaduna expresión regular? Sé que esta es una solución un poco barata, pero las expresiones regulares no son una solución para todo.
Por ejemplo, con la manipulación de cadenas de Bash:
foo="gtk2-2.24.22-2.fc20.x86_64"
echo ${foo%.*.*} # strip the longest match from the last dot
Devoluciones gtk2-2.24.22-2
.
Puedes llamar eso en un archivo así:
foo=$(head -1 file.txt)
echo ${foo%.*.*} > new-file.txt
Las expresiones regulares son buenas para analizar algo desde el principio, no desde atrás, ya que consumen de forma "codiciosa" de izquierda a derecha. Es factible, pero debes ser un poco más detallado de lo que podrías hacer en Bash simple.
Tenga en cuenta que lo que parece una expresión regular en Bash ( .*
) no es una expresión regular "real". En una expresión regular real, el punto .
representa todos los caracteres y *
significa que el carácter (grupo) anterior se repite de 0 a n veces. Sin embargo, en Bash, el punto .
significa un punto real y *
es un comodín para todos los caracteres.