Pregunta Eliminar líneas en un archivo de texto que contiene una cadena específica


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


1319
2018-03-23 19:46


origen


Respuestas:


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

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

Para modificar directamente el archivo:

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

Para modificar directamente el archivo (y crear una copia de seguridad):

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

Para usuarios de Mac OS X:

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

1978
2018-03-23 19:48



hay muchas otras maneras de eliminar líneas con cadenas específicas además sed

awk

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

Ruby (1.9+)

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

Perl

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

Shell (bash3.2 +)

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

GNU grep

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

y por supuesto sed (imprimir el inverso es más rápido que la eliminación real).

sed -n '/pattern/!p' file 

523
2018-03-23 23:57



Puede usar sed para reemplazar las líneas en su lugar 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

El primer comando toma 3 veces más tiempo en mi máquina de todos modos.


187
2017-11-02 02:37



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

sed --in-place '/some string here/d' yourfile

51
2018-01-02 17:56



Puede considerar usar ex (que es un editor estándar basado en comandos de UNIX):

ex +g/match/d -cwq file

dónde:

  • + ejecuta el comando Ex dado (man ex), igual que -c que ejecuta wq (escribir y salir)
  • g/match/d - Ex comando para eliminar líneas con dado match, ver: Poder de g

El ejemplo anterior es el método compatible con POSIX para editar un archivo de acuerdo con este publicar en Unix.SE y Especificaciones POSIX para ex.


La diferencia con sed es eso:

sed es un Stream EDitor, no es un editor de archivos.BashFAQ

a menos que disfrute de un código no portable, sobrecarga de E / S y algunos otros efectos secundarios negativos. Básicamente, algunos parámetros (como in situ /-i) son extensiones de FreeBSD no estándar y pueden no estar disponibles en otros sistemas operativos.


25
2017-10-17 11:54



Estaba luchando con esto en Mac. Además, tenía que hacerlo usando reemplazo variable. Entonces usé:

sed -i '' "/$pattern/d" $file

dónde $file es el archivo donde se necesita eliminación y $pattern es el patrón que debe coincidir para su eliminación. Elegido el '' de esto comentario. Lo que hay que notar aquí es el uso de doble comillas en "/$pattern/d". La variable no funcionará cuando usemos comillas simples.


13
2018-03-09 15:39



Para obtener un lugar como resultado con grep Puedes hacerlo:

echo "$(grep -v "pattern" filename)" >filename

12
2018-06-13 19:24



He hecho un pequeño punto de referencia con un archivo que contiene aproximadamente 345 000 líneas. El camino con grep parece ser alrededor de 15 veces más rápido que el sed método en este caso.

He intentado tanto con y sin la configuración LC_ALL = C, que no parece cambiar los tiempos significativamente. La cadena de búsqueda (CDGA_00004.pdbqt.gz.tar) está en algún lugar en el medio del archivo.

Aquí están los comandos y los tiempos:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

10
2018-03-19 12:45



SED:

AWK:

GREP:


8
2017-08-25 08:21



Puedes usar esto también

 grep -v 'pattern' filename

aquí -v imprimirá solo que no sea tu patrón (eso significa Invertir coincidencia)


7
2018-03-28 07:11