¿Cómo eliminar todas las líneas del archivo de texto que contiene las palabras "gato" y "rata"?
¿Cómo eliminar todas las líneas del archivo de texto que contiene las palabras "gato" y "rata"?
Respuestas:
grep
acercarse a, aproximarsePara crear una copia del archivo sin líneas que coincidan con "cat" o "rat", se puede usar grep
en 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 cats
o, grateful
por ejemplo. La redirección de salida de su shell se usa ( >
) para escribirla en un nuevo archivo. Necesitamos la -E
opción para habilitar las expresiones regulares extendidas para la (one|other)
sintaxis.
sed
acercarse a, aproximarseAlternativamente, para eliminar las líneas en el lugar, se puede usar sed -i
:
sed -i "/\b\(cat\|rat\)\b/d" filename
Los \b
conjuntos de palabras fronteras y la d
operación borra la línea que coincida con la expresión entre las barras diagonales. cat
y rat
ambos están siendo emparejados por la (one|other)
sintaxis que aparentemente necesitamos escapar con barras invertidas.
Consejo: use sed
sin el -i
operador para probar la salida del comando antes de sobrescribir el archivo.
(Basado en Sed - Eliminar una línea que contiene una cadena específica )
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
Considere si tiene un archivo file_name
y desea buscar el mouse, pero al mismo tiempo pocas filas del mouse tienen otras palabras como cat
y rat
y no desea verlas en su salida, por lo que la única forma de hacerlo es:
grep -r mouse file_name | grep -vE "(cat|rat)"
Funciona en /bin/sh
, que está dash
en Ubuntu, así como ksh
, y bash
. Ligeramente incómodo que tenga que escribir múltiples casos de prueba para cada palabra en una case
declaració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