Eliminar fila si se encuentran dos patrones en la misma línea

Eliminar fila si se encuentran dos patrones en la misma línea

Me gustaría eliminar una línea de un archivo de texto ( ) si se encuentran input.txtdos patrones ( string1y ) en elstring2mismofila, usando sed.

Lo estoy intentando: sed -i "/\b\(string1\|string2\)\b/d" input.txt, pero esto está eliminando filas que contienen string1OR string2.

Respuesta1

sed -i "/string1.*string2\|string2.*string1/d" input.txt

Esto eliminará cualquier línea donde la cadena1 aparezca antes de la cadena2, O la cadena2 aparezca antes de la cadena1. Ambas cadenas deben estar en la línea, en cualquier orden, para que se elimine la línea.

Respuesta2

sed -ie '/string1/!b' -e '/string2/d' file.txt

Eso elimina las líneas que contienen ambos string1e string2independientemente del orden (pueden incluso superponerse como cuando se busca foobaren barbazuna línea que contiene foobarbaz).

-iarriba es una extensión GNU. Otra solución específica de GNU¹:

awk -i /usr/share/awk/inplace.awk '!(/string1/ && /string2/)' file.txt

De forma portátil, probablemente usarías perlaquí:

perl -ni -e 'print unless /string1/ && /string2/'

¹no utilice-i inplaceas gawkintenta cargar primero la inplaceextensión (como inplaceo inplace.awk) desde el directorio de trabajo actual, donde alguien podría haber colocado malware. La ruta de la inplaceextensión suministrada gawkpuede variar según el sistema; consulte el resultado degawk 'BEGIN{print ENVIRON["AWKPATH"]}'

Respuesta3

Usandorakú(anteriormente conocido como Perl_6)

~$ raku -ne '.put unless .match(/ foobar / & / barbaz / ) ;'   file

O

~$ raku -ne '.put unless grep({ / foobar / & / barbaz / }, $_ ) ;'   file

Arriba hay dos formas generales de realizar la tarea del OP usando Raku. La nota grepen Raku es similar a la grepde Perl, excepto que se requiere una coma después del bloque. También puedes usar la .grepllamada al método y no tener que preocuparte por escribir $_dentro de los paréntesis.

Cualquiera de los ejemplos de código anteriores eliminará las líneas que contengan dos cadenas,independientemente del orden Y sin importar si las cadenas se superponen.Por ejemplo:

Entrada de muestra:

1  foo
2  bar
3  baz
4  foobar
5  foobaz
6  barbaz
7  foobar foobaz
8  foobaz barbaz
9  foobar barbaz
10 foobar foobaz barbaz
11 foobaz barbaz foobar
12 barbaz foobar foobaz
13 foobarbaz

Salida de muestra (cualquiera de los ejemplos de código anteriores):

1  foo
2  bar
3  baz
4  foobar
5  foobaz
6  barbaz
7  foobar foobaz
8  foobaz barbaz

El código anterior elimina las líneas 9 a 13, incluida la línea 13 foobarbazque contiene cadenas1 y cadenas2 superpuestas. Si necesita eliminar cadenas que aparecen en un orden definido (y sin superposición), Raku también puede hacerlo:

~$ raku -ne '.put unless m/foobar .* barbaz/;'  file

Arriba elimina las líneas 9 y 10: foobar barbazy foobar foobaz barbaz.


Tenga en cuenta que al usar expresiones regulares de Rakupoderdetecta dos cadenas que se superponen, con el parámetro/adverbio :overlap(o ). :ovVea el primer enlace a continuación.


https://docs.raku.org/language/regexes#Overlap
https://docs.raku.org/language/regexes
https://raku.org

información relacionada