Sed elimina todas las coincidencias de patrones iniciales de la línea


11

Tengo la siguiente línea:

abababtestab

Estoy tratando de encontrar una sedexpresión para eliminar todas las ocurrencias abdesde el principio de la línea, por lo que la línea transformada debería ser:

testab

Siento que esto debería ser simple, pero realmente no sé nada al respecto sed.

Lo que tengo hasta ahora es:

sed 's/^ab//'

Pero esto solo elimina la primera aparición de ab.

Respuestas:


16
sed 's/^\(ab\)*//' <in >out

Deberías agruparlo.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Sin embargo, es posible que algunas personas mayoressed no lo manejen muy bien. Aunque la duplicación de subexpresión es una característica de BRE especificada por POSIX , algunos seds no la admiten correctamente. En algunos de esos, sin embargo ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... podría funcionar en su lugar.


Exactamente lo que estaba buscando, gracias! (Marcaré como respuesta una vez que me lo permita)
Dan

Incluso la séptima edición sedde alrededor de 1979 lo apoyó. Tendría que ser una imitación inferior para no manejar la agrupación.
Jonathan Leffler

@ JonathanLeffler: vea la justificación de la expresión regular POSIX , que es, en parte, en lo que basé la declaración. Tal vez sea una suposición, pero hay un párrafo allí ... Los desarrolladores estándar consideraron el comportamiento histórico común, que lo apoyó \n*, pero no \n\{min,max\}. \(...\)*, o \(...\)\{min,max\}, como resultado no intencional de una implementación específica, y admitieron tanto la duplicación como las expresiones de intervalo después de subexpresiones y referencias inversas.
mikeserv

@JonathanLeffler: Tampoco funciona con la versión sed de los cofres de herramientas de reliquia.
Cuonglm

@cuonglm: la \(ab\)\1*versión funciona con la herencia predeterminada sedy la \(ab\)*versión funciona con la herencia SuSv4 sed. Al menos, lo hace para mi construcción. Es cierto que construí mi conjunto de reliquias contra musl lib C, por lo que puedo imaginar que eso podría hacer que se comporte de manera diferente. Pero, por lo general, cuando una característica específica funciona en una herramienta de herencia de SuSv4 de reliquia pero no en la herramienta predeterminada, es porque el desarrollador lo hizo.
mikeserv

6

Otro sed:

sed -e ':1' -e 's/^ab//;t1'

Con cada línea de entrada, configuramos una etiqueta :1, luego hacemos la ssustitución abal comienzo de la línea. Si la ssustitución se realiza correctamente, se ordena que la trama se etiquete 1, rehaga el trabajo hasta que no aparezca ningún abpatrón al comienzo de la línea, hemos terminado.


Mis pensamientos exactamente. Estrictamente, no necesita probar: s/^ab//; t1es suficiente
glenn jackman

@glennjackman: Ah, por supuesto. ¡Lo actualicé!
Cuonglm
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.