
Me gustaría eliminar una línea de un archivo de texto ( ) si se encuentran input.txt
dos patrones ( string1
y ) en elstring2
mismofila, usando sed
.
Lo estoy intentando:
sed -i "/\b\(string1\|string2\)\b/d" input.txt
, pero esto está eliminando filas que contienen string1
OR 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 string1
e string2
independientemente del orden (pueden incluso superponerse como cuando se busca foobar
en barbaz
una línea que contiene foobarbaz
).
-i
arriba 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 perl
aquí:
perl -ni -e 'print unless /string1/ && /string2/'
¹no utilice-i inplace
as gawk
intenta cargar primero la inplace
extensión (como inplace
o inplace.awk
) desde el directorio de trabajo actual, donde alguien podría haber colocado malware. La ruta de la inplace
extensión suministrada gawk
puede 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 grep
en Raku es similar a la grep
de Perl, excepto que se requiere una coma después del bloque. También puedes usar la .grep
llamada 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 foobarbaz
que 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 barbaz
y 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 ). :ov
Vea el primer enlace a continuación.
https://docs.raku.org/language/regexes#Overlap
https://docs.raku.org/language/regexes
https://raku.org