
Quiero eliminar algún texto de file1.txt
.
Pongo el texto en el archivo tmp
y hago:
grep -f tmp file.txt
Pero solo me da la diferencia.
La pregunta es cómo eliminar la diferencia file.txt
.
Respuesta1
Al hacerlo grep -f tmp file.txt
se mostrarán todas las líneas que contienen la palabra text
(supongamos tmp
que solo contiene la palabra text
). Si desea mostrar todas las líneas que no contienen la palabra texto, debe usar la -v
opción para invertir la coincidencia:
$ grep -v 'text' file.txt
Si imprime todas las líneas del archivo pero simplemente elimina todas las apariciones de text
entonces:
$ sed 's/text//g'
Respuesta2
Si desea eliminar líneas file.txt
que contienen la línea donde text
está la semilla, puede hacer algo como:
sed '/text/d' file.txt
o
sed -n '/text/!p' file.txt
Respuesta3
Lo que quieres hacer es
grep -Fvf tmp file.txt
De man grep
:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The
empty file contains zero patterns, and
therefore matches nothing. (-f is specified
by POSIX.)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings,
separated by newlines, any of which is to be
matched. (-F is specified by POSIX.)
-v, --invert-match
Invert the sense of matching, to select non-
matching lines. (-v is specified by POSIX.)
Entonces, -f
le indica grep
que lea la lista de patrones que buscará en un archivo. -F
es necesario, por lo que grep
no interpreta estos patrones como expresiones regulares. Entonces, dada una cadena como foo.bar
, se .
tomará como literal .
y no como "coincide con cualquier carácter". Finalmente, -v
invierte la coincidencia, por lo que grep
imprimirá solo aquellas líneas que no coincidan con ninguno de los patrones en tmp
. Por ejemplo:
$ cat pats
aa
bb
cc
$ cat file.txt
This line has aa
This one contains bb
This one contains none of the patterns
This one contains cc
$ grep -Fvf pats file.txt
This one contains none of the patterns
Respuesta4
Lo que hago es:
sed '/text_to_delete/d' filename | sponge filename
Esto realizará el cambio en el archivo fuente.