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.txt
me 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 hold
espacio 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 t
o b
, haciendo feliz a bsd sed.