¿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
maihabunash
fuente

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
jimmij
fuente
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
27

También podría manejar esto con la expansión de parámetros bash :

s=swp-RedHat-Linux-OS-5.5.0.0-03
echo ${s%-*} ${s##*-}

Salida:

swp-RedHat-Linux-OS-5.5.0.0 03
Thor
fuente
Muy creativo, me encanta esta respuesta
dpritch
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
rahul
fuente
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