
Quero remover algum texto do file1.txt
.
Coloquei o texto no arquivo tmp
e faço:
grep -f tmp file.txt
Mas isso me dá apenas a diferença.
A questão é como remover a diferença de file.txt
.
Responder1
Fazer grep -f tmp file.txt
irá exibir todas as linhas que contêm a palavra text
(suponha que tmp
contenha apenas a palavra text
). Se você deseja exibir todas as linhas que não contêm a palavra texto, você precisa usar a -v
opção para inverter a correspondência:
$ grep -v 'text' file.txt
Se você imprimir todas as linhas do arquivo, mas apenas remover todas as ocorrências text
:
$ sed 's/text//g'
Responder2
Se você deseja remover linhas do seu file.txt
que contém a linha onde text
está a semente, você pode fazer algo como:
sed '/text/d' file.txt
ou
sed -n '/text/!p' file.txt
Responder3
O que você quer fazer é
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.)
Então, -f
diz grep
para ler a lista de padrões que irá procurar em um arquivo. -F
é necessário, portanto grep
não interpreta esses padrões como expressões regulares. Portanto, dada uma string como foo.bar
, .
será considerada literal .
e não como "corresponde a qualquer caractere". Por fim, -v
inverte a correspondência, grep
imprimindo apenas as linhas que não correspondem a nenhum dos padrões em tmp
. Por exemplo:
$ 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
Responder4
O que eu faço é:
sed '/text_to_delete/d' filename | sponge filename
Isso fará a alteração no arquivo de origem.