eliminar texto del archivo

eliminar texto del archivo

Quiero eliminar algún texto de file1.txt.

Pongo el texto en el archivo tmpy 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.txtse mostrarán todas las líneas que contienen la palabra text(supongamos tmpque solo contiene la palabra text). Si desea mostrar todas las líneas que no contienen la palabra texto, debe usar la -vopció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 textentonces:

$ sed 's/text//g' 

Respuesta2

Si desea eliminar líneas file.txtque contienen la línea donde textestá 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, -fle indica grepque lea la lista de patrones que buscará en un archivo. -Fes necesario, por lo que grepno 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, -vinvierte la coincidencia, por lo que grepimprimirá 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.

información relacionada