Eliminar líneas con patrón coincidente después de la primera línea con sed

Eliminar líneas con patrón coincidente después de la primera línea con sed

Me gustaría eliminar cada línea que contenga un patrón después de la primera línea (el patrón es/^country\t/ ). puedo borrarcadaocurrencia con sed '/^country\t/d' in.txt > out.txt, pero me gustaría mantener la primera aparición en la primera línea.

La historia de fondo es que tengo un directorio de archivos delimitados por tabulaciones con encabezados y concateno estos archivos con cat. Me gustaría eliminar los encabezados adicionales.

En Vim podría hacer algo como : 2,$g/^country\t/d, pero no puedo encontrar la solución sed. Cuando lo intento sed '2,$ /^country\t/d in.txt > out.txtme sale el error unknown command: /.

¡Gracias!

Respuesta1

No hay una forma directa, pero esta es una solución alternativa:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

Respuesta2

Esto podría funcionar para usted:

sed '1b;/^country\t/d' in.txt > out.txt

o

sed '1!{/^country\t/d}' in.txt > out.txt

Respuesta3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

Esto eliminará todas las líneas coincidentes DESPUÉS de la primera línea coincidente. Comentario:

/patrón/- patrón de coincidencia

{X- si lo anterior coincide, intercambie el patrón y mantenga el búfer

;/patrón/!{x;h;b;}- ahora prueba el buffer de patrones (ahora estará vacío en la PRIMERA coincidencia) y si no es así. ya contiene el patrón, luego intercambie 'x' el patrón y mantenga el búfer nuevamente, luego COPIE el búfer de patrón en el búfer de retención 'h', ramifique 'b' hasta el final del script y cargue la siguiente línea.

;x;d}- este bit sólo se ejecuta si falla la coincidencia de patrón negada en el paso anterior, es decir, el búfer de patrón coincide con su patrón. En este caso, vuelva a intercambiar el búfer de patrón y retención 'x' y elimine 'd' de la línea.

Respuesta4

si /pattern/ no coincide con una línea vacía, entonces use "el holdespacio se inicializa como línea vacía" para probar la primera coincidencia:

conservar la primera línea:

sed '/pattern/ {x; /^$/!d; g;}' file

suelte la primera línea:

sed '/pattern/ x' file

solo edite la primera línea:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

solo edite la siguiente línea:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PD: $'\n'(no un ;) sigue to b, haciendo feliz a bsd sed.

información relacionada