举一个简单的例子,假设我有一个列表文件,其中包含以下内容
cat dog pig
dog hat
cat
clap sing
king
ca
cat hog
plate
plate
one two three
cat
然后我有一个“模式”文件。内容如下
cat
dog
我希望发生的是从列表文件创建一个新文件,但所有以 cat 或 dog 开头的行都不会被复制。
我已经看到了一些例子,说明这是如何运作的,例如
sed '/pattern to match/d' ./infile > ./newfile
据我所知,sed 无法处理“模式输入文件”。是否有与 sed 类似的程序可以实现我想要的功能?如果没有,是否可以用 python 程序编写一个程序,从“模式”文件中读取每一行,然后针对列表文件运行 sed 命令,例如使用 seds 进行多次传递
答案1
您可以使用 tell grep 从文件中读取其模式 - 使用 -v(反转)开关可以执行您想要的操作。
fgrep -vf patternfile listfile
从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.)
答案2
我不确定这是否是你想要的。我已经按照你的要求删除了狗和猫的多个图案,并将修改后的内容保存在新文件中。查看代码
sed '/cat/d; /dog/d' file1.txt > file2.txt
下面以及终端中的示例(CTRL+ALT +T)
raja@debian:~/sand$ cat file1.txt
cat dog pig
dog hat
cat
clap sing
king
ca
cat hog
plate
plate
one two three
cat
raja@debian:~/sand$ sed '/cat/d; /dog/d' file1.txt > file2.txt
raja@debian:~/sand$ cat file2.txt
clap sing
king
ca
plate
plate
one two three
raja@debian:~/sand$