file1.txt
からテキストを削除したい。
テキストをファイルtmp
に入れて、次のようにします。
grep -f tmp file.txt
しかし、それは私に違いを与えるだけです。
問題は、file.txt
からの違いをどのように取り除くかです。
grep -f tmp file.txt
を実行すると、作業text
を含むすべての行が表示されます(tmp
が作業text
を継続すると仮定します)。 Wordテキストを含まないすべての行を表示する場合は、-v
オプションを使用して一致を反転する必要があります。
$ grep -v 'text' file.txt
ファイル内のすべての行を出力し、text
のすべての出現箇所を削除した場合、次のようになります。
$ sed 's/text//g'
text
がシードである行を含む行をfile.txt
から削除したい場合は、次のようにすることができます。
sed '/text/d' file.txt
または
sed -n '/text/!p' file.txt
あなたがしたいことは
grep -Fvf tmp file.txt
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.)
したがって、-f
はgrep
に、ファイルから検索するパターンのリストを読み取るように指示します。 -F
が必要なので、grep
はこれらのパターンを正規表現として解釈しません。したがって、foo.bar
のような文字列を指定すると、.
はリテラル.
と見なされ、「任意の文字と一致する」とは見なされません。最後に、-v
は一致を反転するため、grep
はtmp
のどのパターンにも一致しない行のみを出力します。例えば:
$ 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
私がしていることは:
sed '/text_to_delete/d' filename | sponge filename
これにより、ソースファイルが変更されます。