¿Puedo eliminar sólo la primera línea coincidente usando sed?

¿Puedo eliminar sólo la primera línea coincidente usando sed?

Tengo un archivo testfile.txtque contiene

pippo=x
pluto=y
1234=z

Me gustaría eliminar sólola primeracoincidencia de líneas /^[a-z]\+=/(la primera línea en este ejemplo).

Lo intenté con el siguiente comando pero sin éxito:

sed   '/^[a-z]\+=/,+0d' testfile.txt

pero el primerodosSe eliminan líneas.

¿Hay alguna manera de realizar esta tarea usando sed?

Saludos

Respuesta1

El problema con tu sedcomando

$ sed '/^[a-z]\+=/,+0d' testfile.txt

es que el sedguión se aplica acadalínea de los datos de entrada.

( que +0es una extensión GNU) significa que su script es equivalente a

$ sed '/^[a-z]\+=/d' testfile.txt

y la primera y segunda líneas se eliminarían, como habrás notado.

Por cierto, obtendrás exactamente lo mismo.efectousando +1, pero por otras razones. El dcomando, en lugar de aplicarse a las líneas uno y dos individualmente, se aplicaría a las dos primeras líneas debido a la coincidencia en la primera línea (es decir, el rango del dcomando sería las líneas uno y una más +1). Esto no elimina la línea tres porque está fuera del rango.

sedLa solución GNU

$ sed '0,/^[a-z]\+=/{//d}' testfile.txt

ese usuario @Whitefield publicado funciona y es bastante bueno (aunque la -ropción es innecesaria y la 0dirección de inicio se puede cambiar 1en este caso, si desea ser más POSIX).

Una variante BSD seddel mismo enfoque sería así

$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
  }' testfile.txt

Escapar de +solo es necesario si sedimplementa "expresiones regulares básicas obsoletas" en lugar de "expresiones regulares básicas modernas". Tanto BSD sedcomo GNU seden mi sistema (Mac OS X) parecen ser del tipo "moderno". POSIX no tiene esta distinción, y leer los manuales ( re_format(7)en BSD, que hace esta distinción) y la especificación POSIX uno al lado del otro me hace dar vueltas la cabeza.

Respuesta2

@ John1024 Lo siento, pero su solución solo funciona si la primera línea coincidente es la primera línea del archivo.

Resolví el problema con el siguiente código sed -r '0,/^[a-z]\+=/{//d;}' testfile.txtpero todavía estoy convencido de que mi solución anterior debería haber funcionado incluso con posix sed.

De hecho, la idea era dar como dirección de segunda línea un desplazamiento de 0 líneas... pero aún así elimina también la siguiente línea, esto suena como un error.

desde man seden ubuntu 14.04

... addr1,+N Coincidirá con addr1 y las N líneas que siguen a addr1. ...

información relacionada