我有一个包含以下行的文件:
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