Eliminar hasta la primera aparición de colon utilizando sed


16

Mi comando sed es,

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Debe volver,

bcde:cdeaf

(es decir, todos los caracteres anteriores al primer colon de la línea y el mismo colon deben eliminarse).

Pero esto no elimina nada.

Mi confusión surge principalmente debido a,

1) ¿Es necesario escapar a los parens para la coincidencia de patrones dentro de las expresiones regulares sed?

2) En cualquier caso (con escape / sin escpaing), no está funcionando. Lo intenté,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
desea sed 's/[^:]*://'. Y no está deligiendo la línea de entrada, por cierto, la está modificando con un s///comando de sustitución. Debe reemplazar el primer bit que no es de dos puntos y el punto que le sigue con nada en absoluto.
mikeserv

eso lo resuelve ... gracias, hombre ... este es un ejemplo que tomé para aprender la coincidencia de patrones de expresiones regulares dentro de sed ... entonces, estoy buscando una respuesta que use la coincidencia de grupo / patrón con parens ...

3
O, simplemente usando bash: printf "%s\n" "${line#*:}"...
jasonwryan

1
@jasonwryan: buen punto, teniendo en cuenta la fuente de ejemplo. definitivamente es la forma más eficiente de manejarlo. pero si es un while read lineque obtiene el $line, probablemente seddebería preferirse.
mikeserv

Respuestas:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

El primero ^significa el comienzo de la línea. El [^:]es simplemente la única manera que sé cómo escribir no dos puntos . El *después de los dos puntos significa cualquier número de las cosas bien antes que yo (en este caso la no-colon). Finalmente, el :selecciona los dos puntos.

En otras palabras, seleccione el comienzo de la línea, cualquier cantidad de cosas que no sean dos puntos y el primer punto.

Los //gmedios eliminan cada instancia coincidente.


3
no necesitas ^anclar tu partida, excepto porque también agregas una gbandera lobal. solo puede haber una primera aparición de un patrón, por lo que la gbandera lobal no elimina todos los [^:]*:patrones de una línea, como lo haría si no lo ^anclaras. en lugar de complicar la expresión regular con dos indicadores innecesarios que solo sirven para desequilibrar el uno al otro, simplemente puede dejarlos fuera, que es lo que demostró la versión editada de esta respuesta antes de revertirla. ¿Por qué insistes en difundir mala información? No lo sé, pero es una mala respuesta.
mikeserv

@mikeserv, como ya dije, gracias por señalar esto. Le agradezco sinceramente que me ayude a mejorar mis sedhabilidades. Soy nuevo sedy todavía no me siento cómodo alejándome de la sintaxis muy limitada que he recogido hasta ahora. Eso sed(je), creo que mi respuesta resuelve el problema de OP a pesar de que no es la respuesta óptima (es decir, su). Este es Stack Exchange, no Wikipedia, así que corrígeme si estoy equivocado, pero si sabes una mejor respuesta, debes publicarla para que la gente pueda ver la variedad de enfoques y compararlos. No convierta mi respuesta en su respuesta con la función de edición .
user1717828

44
No fue mi respuesta. fue tu respuesta, editada. eso es todo. Y estuvo bien . ya no lo es.
mikeserv

4

Para operar con columnas hay cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

lo mismo hacer

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

Y otra versión con sed(más rápido para big data):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

Y bastante exótico en bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

o

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

o

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

También puede agregar la forma correcta de hacerlo con sed, es decirsed 's/[^:]*://'
don_crissti

@don_crissti La versión se anota en la respuesta anterior. Además, debido al uso de expresiones regulares , es más lento ya que tiene que compilar expresiones en cada línea.
Costas

No, no es. La respuesta anterior apesta mucho y merece muchos votos negativos, especialmente si lees las revisiones y los comentarios allí.
don_crissti
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.