¿Cómo reemplazo la última aparición de un carácter en una cadena usando sed?


31

¿Cómo reemplazo solo la última aparición de "-" en una cadena con un espacio usando sed?

Por ejemplo:

echo $MASTER_DISK_RELEASE
swp-RedHat-Linux-OS-5.5.0.0-03

pero quiero obtener el siguiente resultado (reemplazando el último guión ["-"] con un espacio)

swp-RedHat-Linux-OS-5.5.0.0 03

Respuestas:


48

Puedes hacerlo con single sed:

sed 's/\(.*\)-/\1 /'

o, usando una expresión regular extendida:

sed -r 's/(.*)-/\1 /'

El punto es que sedes muy codicioso, por lo que coincide con tantos personajes -como sea posible antes , incluidos otros -.

$ echo 'swp-RedHat-Linux-OS-5.5.0.0-03' | sed 's/\(.*\)-/\1 /'
swp-RedHat-Linux-OS-5.5.0.0 03

2
Tenga en cuenta que esto no es portátil. Algunas versiones no GNU de sedno admiten coincidencias de patrones. En ese caso, necesitará algo más, ya sea perl -pne 's/(.*)-/$1 /'la solución de expansión de parámetros de @ Thor u otra cosa.
Adam Katz

por supuesto :-) gracias ...
Greg

No debería necesitar escapar de esos corchetes al usar comillas simples.
jgmjgm

@jgmjgm Puede omitir barras invertidas utilizando expresiones regulares extendidas con sed -r.
jimmij

1
@VinayPotluri Inténtalo sed -r 's/(.*)-(.*)-/\1 \2 /').
jimmij


11

Algo como esto funcionó para mí, aunque estoy seguro de que hay mejores maneras

echo "swp-RedHat-Linux-OS-5.5.0.0-03" | rev | sed 's/-/ /' | rev
swp-RedHat-Linux-OS-5.5.0.0 03

Esto es malo ... simplemente malo. ¿Por qué hacer 4 operaciones cuando puedes hacer 2?
Joshpbarron

77
Para alguien con solo una comprensión básica de las expresiones regulares, esta respuesta parece mucho más accesible. Y a quién le importa cuántas operaciones se requieren, esto será instantáneo para todos los casos prácticos. Por lo tanto, consideraría la legibilidad sobre alguna regla arbitraria para usar la menor cantidad de operaciones posible.
Psirus

55
@Psirus Espero que esto no abra una lata de gusanos, pero la idea de usar operaciones menores es mostrar un cierto nivel de dominio de las operaciones menores . Por ejemplo, la respuesta de @ Thor muestra una apreciación de la bashfunción de expansión de parámetros, que funciona bien si OP también está usando bash. Habrá un delicado equilibrio entre la legibilidad (hasta el punto de ser muy detallado) y el uso de las herramientas adecuadas, pero la mayoría de las veces prevalece el uso de las herramientas correctas.
hjk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.