¿Cómo usar Sed para reemplazar todos los caracteres antes de los dos puntos?


25

¿Cómo reemplazo la siguiente cadena?

hd_ma_prod_customer_ro:*:123456789:john.doe

con john.doe

Básicamente, necesito buscar los últimos dos puntos (:) y eliminar todo antes e incluirlo.

Respuestas:


40

Suponiendo que lo que realmente quiere decir es que desea eliminar todo hasta el último colon y dejar john.doeintacto:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Explicación:

La primera línea simplemente canaliza la cadena de prueba sedpara fines de ejemplo.

El segundo es una sedsustitución básica . La parte entre el primero y el segundo /es la expresión regular a buscar y la parte entre el segundo y el tercero es con qué reemplazarla (nada en este caso, ya que estamos eliminando).

Para la expresión regular, .coincide con cualquier carácter, *repite esto cualquier número de veces (incluido cero) y :coincide con dos puntos. Entonces, efectivamente, es cualquier cosa seguida de un colon. Como .*puede incluir dos puntos, la coincidencia es 'codiciosa' y se incluye todo hasta el último punto.


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Estoy reemplazando todas las apariciones de : con una pestaña y luego la uso awkpara extraer la cadena john.doe.

Si no tiene un archivo, puede probar esto.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Según los comentarios de Graeme, podemos usar awkpara imprimir la última columna solo usando la NFvariable de la awksiguiente.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Incorporando los comentarios de Graeme para deshacerse de lo innecesario sed

El comando se puede modificar de la siguiente manera.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
Si vas a usar awk, ¿por qué no simplemente hacerlo awk -F:?
Graeme

@Graeme, todavía no me siento tan cómodo awk. Básicamente, trato de probar los comandos que obtuve originalmente en mi respuesta e intento modificarlos de acuerdo con los requisitos del usuario. :)
Ramesh

3
La -Fopción para awkespecifica el separador de campo. Si le indica awkque use dos puntos, no es necesario reemplazar los dos puntos con pestañas. Además, si desea obtener el último campo que puede usar en $NFlugar de $4, esto funcionaría si no siempre hay 3 puntos.
Graeme

@Graeme, he incorporado los cambios que ha mencionado. Por favor, avíseme si esto está bien :)
Ramesh

Si, funciona perfectamente!
Graeme


2

Por favor, inténtalo

editar: ancla eliminada

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

y para borrar

echo 'abc:fjk' |sed 's/.*://g'

eso no es lo que pide el OP
iruvar

Vuelva a leer la pregunta nuevamente.
akash

Bueno, te metiste en la eliminación después de mi comentario, no importa
iruvar

Oh ya veo . Mis disculpas 1_CR
akash

1
El ^ancla no hace ninguna diferencia en el caso de la pregunta o en su caso de ejemplo. Cualquier dirección que comience /.*ya implica el ^.
mikeserv
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.