我想从中删除一些文本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
这将对源文件进行更改。