¿Cómo eliminar de un archivo de texto todas las líneas que contienen una cadena específica?
¿Cómo usaría sed para eliminar todas las líneas de un archivo de texto que contienen una cadena específica?
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
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
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.
La manera más fácil de hacerlo, con GNU sed
:
sed --in-place '/some string here/d' yourfile