从文件中删除文本

从文件中删除文本

我想从中删除一些文本file1.txt

我将文本放入文件中tmp并执行以下操作:

grep -f tmp file.txt

但它只告诉我差异。

问题是如何消除其中的差异file.txt

答案1

这样做grep -f tmp file.txt将显示所有包含单词的行text(假设tmp只包含单词text)。如果要显示所有不包含单词文本的行,则需要使用选项-v来反转匹配:

$ grep -v 'text' file.txt

如果你打印文件中的所有行但只是删除所有出现的text行:

$ sed 's/text//g' 

答案2

如果你想从file.txt包含text种子行的行中删除,那么你可以执行以下操作:

sed '/text/d' file.txt

或者

sed -n '/text/!p' file.txt

答案3

你想要做的是

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

答案4

我的做法是:

sed '/text_to_delete/d' filename | sponge filename

这将对源文件进行更改。

相关内容