从列表中删除所有以井号开头的行

从列表中删除所有以井号开头的行

举一个简单的例子,假设我有一个列表文件,其中包含以下内容

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$ 

相关内容