¿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 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, aproximarseAlternativamente, 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 )
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_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)"
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