¿Cómo eliminar de un archivo de texto todas las líneas que contienen una cadena específica?

Resuelto A Clockwork Orange asked hace 13 años • 21 respuestas

¿Cómo usaría sed para eliminar todas las líneas de un archivo de texto que contienen una cadena específica?

A Clockwork Orange avatar Mar 24 '11 02:03 A Clockwork Orange
Aceptado

Para eliminar la línea e imprimir la salida en formato estándar:

sed '/pattern to match/d' ./infile

Para modificar directamente el archivo – no funciona con BSD sed:

sed -i '/pattern to match/d' ./infile

Lo mismo, pero para BSD sed (Mac OS X y FreeBSD) – no funciona con GNU sed:

sed -i '' '/pattern to match/d' ./infile

Para modificar directamente el archivo (y crear una copia de seguridad), funciona con BSD y GNU sed:

sed -i.bak '/pattern to match/d' ./infile
SiegeX avatar Mar 23 '2011 19:03 SiegeX

Hay muchas otras formas de eliminar líneas con una cadena específica además de sed:

AWK

awk '!/pattern/' file > temp && mv temp file

Rubí (1.9+)

ruby -i.bak -ne 'print if not /test/' file

perla

perl -ni.bak -e "print unless /pattern/" file

Shell (bash 3.2 y posteriores)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file

grupo GNU

grep -v "pattern" file > temp && mv temp file

Y, por supuesto sed(imprimir lo inverso es más rápido que eliminarlo):

sed -n '/pattern/!p' file
kurumi avatar Mar 23 '2011 23:03 kurumi

Puedes usar sed para reemplazar líneas en un archivo. Sin embargo, parece ser mucho más lento que usar grep para el inverso en un segundo archivo y luego mover el segundo archivo sobre el original.

p.ej

sed -i '/pattern/d' filename      

o

grep -v "pattern" filename > filename2; mv filename2 filename

De todos modos, el primer comando tarda 3 veces más en mi máquina.

slashdottir avatar Nov 02 '2012 02:11 slashdottir

La manera más fácil de hacerlo, con GNU sed:

sed --in-place '/some string here/d' yourfile
Kevin Nguyen avatar Jan 02 '2015 17:01 Kevin Nguyen