¿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.

yihyoon
fuente

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.

Graeme
fuente
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}'
Ramesh
fuente
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
6

Otro método usando awk:

awk -F: '{ print $NF }'
Chris Down
fuente
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'
akash
fuente
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