Tengo un archivo testfile.txt
que 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 sed
comando
$ sed '/^[a-z]\+=/,+0d' testfile.txt
es que el sed
guión se aplica acadalínea de los datos de entrada.
( que +0
es 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 d
comando, 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 d
comando sería las líneas uno y una más +1
). Esto no elimina la línea tres porque está fuera del rango.
sed
La solución GNU
$ sed '0,/^[a-z]\+=/{//d}' testfile.txt
ese usuario @Whitefield publicado funciona y es bastante bueno (aunque la -r
opción es innecesaria y la 0
dirección de inicio se puede cambiar 1
en este caso, si desea ser más POSIX).
Una variante BSD sed
del mismo enfoque sería así
$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
}' testfile.txt
Escapar de +
solo es necesario si sed
implementa "expresiones regulares básicas obsoletas" en lugar de "expresiones regulares básicas modernas". Tanto BSD sed
como GNU sed
en 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.txt
pero 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 sed
en ubuntu 14.04
... addr1,+N Coincidirá con addr1 y las N líneas que siguen a addr1. ...