web-dev-qa-db-ja.com

ファイルからテキストを削除する

file1.txtからテキストを削除したい。

テキストをファイルtmpに入れて、次のようにします。

grep -f tmp file.txt

しかし、それは私に違いを与えるだけです。

問題は、file.txtからの違いをどのように取り除くかです。

2
Ellouze Anis

grep -f tmp file.txtを実行すると、作業textを含むすべての行が表示されます(tmpが作業textを継続すると仮定します)。 Wordテキストを含まないすべての行を表示する場合は、-vオプションを使用して一致を反転する必要があります。

$ grep -v 'text' file.txt

ファイル内のすべての行を出力し、textのすべての出現箇所を削除した場合、次のようになります。

$ sed 's/text//g' 
7
iiSeymour

textがシードである行を含む行をfile.txtから削除したい場合は、次のようにすることができます。

sed '/text/d' file.txt

または

sed -n '/text/!p' file.txt
4
jaypal singh

あなたがしたいことは

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.)

したがって、-fgrepに、ファイルから検索するパターンのリストを読み取るように指示します。 -Fが必要なので、grepはこれらのパターンを正規表現として解釈しません。したがって、foo.barのような文字列を指定すると、.はリテラル.と見なされ、「任意の文字と一致する」とは見なされません。最後に、-vは一致を反転するため、greptmpのどのパターンにも一致しない行のみを出力します。例えば:

$ 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
2
terdon

私がしていることは:

sed '/text_to_delete/d' filename | sponge filename

これにより、ソースファイルが変更されます。

0
EsquimaltJim