从列表中删除与多个模式匹配的字符串

从列表中删除与多个模式匹配的字符串

我有一个包含以下行的文件:

1
apple
2
orange
3
banana
4
mango
5
coconut

我有一个模式列表:

1
3
5

我想使用模式列表删除这些行(以及后面的一行),以获得:

2
orange
4
mango

由于我有大量模式,无法在单个命令中一一手动输入,因此必须使用列表。

答案1

sed+粘贴解决方案:

sed -E "/\<(`paste -s -d'|' patterns`)\>/{N;d;}" file

输出:

2
orange
4
mango

  • paste -s -d'|' patterns- 合并文件行patterns用作|分隔符以获得正则表达式交替组(1|3|5)

  • N- 将下一行追加到模式空间

  • d- 删除图案空间的行

答案2

让我们做一些grep选项杂耍:

您可以grep对水果文件中的所有行进行处理,但列表文件中的行除外,并排除数字:

grep -v -x -f numbers fruits

-f给出模式文件,-x防止部分匹配和-v反转匹配)

不幸的是,数字和水果位于不同的行,因此水果在 grep 中幸存下来。让我们用一个额外的模式来摆脱它们-e

grep -v -x -e "[a-z]*" -f numbers fruits

现在所有仅由字母组成的行都被删除,因此不再有水果,甚至是想要的水果。但我们可以从上下文中恢复它们:

grep -v -x -A1 -e "[a-z]*" -f numbers fruits

-A1在每场比赛后给出额外的一行)最终给出了你想要的。

答案3

尝试这个 。

中包含pattern_file您的所有patterns内容和其余内容file_content。在这里,我尝试了可以​​根据模式匹配后的行数进行更改的grep选项。-A 1

#!/bin/bash

while read pattern 
do
        for line_num in `grep $pattern file_content -A 1 -n | awk -F":|-" '{print $1}' | paste -sd ","`
        do
                sed -i "${line_num}d" file_content
        done
done < pattern_file

相关内容