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

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

¿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 lo anterior e incluirlo.

Respuesta1

Suponiendo que lo que realmente quieres decir es que deseas eliminar todo hasta los últimos dos puntos y dejarlo intacto john.doe:

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

Explicación:

La primera línea simplemente canaliza la cadena de prueba para sedfines de ejemplo.

El segundo es un básico.sedsustitución. La parte entre la primera y la segunda /es la expresión regular a buscar y la parte entre la segunda y la tercera es con qué reemplazarla (nada en este caso ya que estamos eliminando).

Para la expresión regular, .coincide con cualquier carácter, *lo repite cualquier número de veces (incluido cero) y :coincide con dos puntos. Así que efectivamente es cualquier cosa seguida de dos puntos. Como .*puede incluir dos puntos, la coincidencia es "codiciosa" y se incluye todo hasta los últimos dos puntos.

Respuesta2

Otro método usando awk:

awk -F: '{ print $NF }'

Respuesta3

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

Estoy reemplazando todas las ocurrencias de:con unpestañay luego usar awkpara extraer la cadena john.doe.

Si no tiene un archivo, puede intentar 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 awkimprimir la última columna sola usando la NFvariable de awkcomo se muestra a continuación.

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

Incorporar los comentarios de Graeme para deshacerse de comentarios innecesarios.sed

El comando se puede modificar como se muestra a continuación.

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

Respuesta4

Por favor, inténtalo

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

y para borrar

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

información relacionada