¿Cómo eliminar líneas del archivo de texto que contiene palabras específicas a través del terminal?


72

¿Cómo eliminar todas las líneas del archivo de texto que contiene las palabras "gato" y "rata"?


Esto suena sospechosamente como una tarea asignada. Recuerde atribuir su respuesta a la gente amable de Askubuntu.
zwets

Como parte del gran proyecto, soy nuevo en el entorno Linux.
PersonX

Respuestas:


100

grep acercarse a, aproximarse

Para crear una copia del archivo sin líneas que coincidan con "cat" o "rat", se puede usar grepen reversa ( -v) y con la opción de palabra completa ( -w).

grep -vwE "(cat|rat)" sourcefile > destinationfile

La opción de palabra completa se asegura de que no coincida catso, gratefulpor ejemplo. La redirección de salida de su shell se usa ( >) para escribirla en un nuevo archivo. Necesitamos la -Eopción para habilitar las expresiones regulares extendidas para la (one|other)sintaxis.

sed acercarse a, aproximarse

Alternativamente, para eliminar las líneas en el lugar, se puede usar sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

Los \bconjuntos de palabras fronteras y la doperación borra la línea que coincida con la expresión entre las barras diagonales. caty ratambos están siendo emparejados por la (one|other)sintaxis que aparentemente necesitamos escapar con barras invertidas.

Consejo: use sedsin el -ioperador para probar la salida del comando antes de sobrescribir el archivo.

(Basado en Sed - Eliminar una línea que contiene una cadena específica )


Me pregunto si hay una manera de lograr la eliminación del archivo fuente Y generar el archivo con coincidencias. Probablemente no, pero sería útil (por ejemplo, cuando obtiene un archivo que crece demasiado, lo está dividiendo en función del contenido).
Sridhar Sarnobat

1
@ Sridhar-Sarnobat Oh, puedes. Use tee y subshells para copiar stdout. En uno se filtra, en el otro al revés. Uso de tee y subshells demostrado en un caso de uso no relacionado demostrado aquí: blog.g3rt.nl/…
gertvdijk

15

Para probar solo en la terminal, use:

sed '/[cr]at/d' file_name

Para eliminar realmente esas líneas del archivo, use:

sed -i '/[cr]at/d' file_name

5

Prueba el vim-way:

ex +"g/[cr]at/d" -scwq file.txt

0

Considere si tiene un archivo file_namey desea buscar el mouse, pero al mismo tiempo pocas filas del mouse tienen otras palabras como caty raty no desea verlas en su salida, por lo que la única forma de hacerlo es:

grep -r mouse file_name | grep -vE "(cat|rat)"

0

forma de concha portátil

Funciona en /bin/sh, que está dashen Ubuntu, así como ksh, y bash. Ligeramente incómodo que tenga que escribir múltiples casos de prueba para cada palabra en una casedeclaración pero portátil. Funciona con casos donde la palabra aparece sola en la línea, al principio, al final de la línea o en el medio de la línea, e ignora dónde podría ser parte de otra palabra.

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

Y así es como funciona:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.