使用sed基于文件输入模式删除行

时间:2015-06-29 06:38:51

标签: bash awk sed

我一直试图解决一个简单的sed line删除问题。 看了here and there。它没有解决我的问题。 我的问题可以简单地通过使用sed -i'{/^1\|^2\|^3/d;}' infile.txt来实现,它从infile.txt中删除以1,2和3开头的行。

但我想要的是从文件中获取起始匹配模式,而不是手动输入流编辑器。

例如:deletePattern

1 
3
2

infile.txt

1 Line here
2 Line here
3 Line here 
4 Line here 

期望的输出

4 Line here 

提前谢谢你,

4 个答案:

答案 0 :(得分:1)

grep应该有效:

grep -Fvf deletePattern infile.txt
4 Line here

但如果在第二个文件中的任何位置找到deletePattern中的模式,则会跳过一行。

使用此awk命令可以实现更准确的结果

awk 'FILENAME == ARGV[1] && FNR==NR{a[$1];next} !($1 in a)' deletePattern infile.txt
4 Line here

答案 1 :(得分:1)

快速命令替换字符类相结合将允许相对较短的oneliner:

$ sed -e "/^[$( while read -r ch; do a+=$ch; done <pattern.txt; echo "$a" )]/d" infile.txt
4 Line here

当然,请将-e更改为-i以进行实际的就地替换。

答案 2 :(得分:1)

使用GNU sed(适用于-f -):

sed 's!^[0-9][0-9]*$!/^&[^0-9]/d!' deletePattern | sed -f - infile.txt

第一个seddeletePattern转换为sed脚本,然后第二个sed应用此脚本。

答案 3 :(得分:0)

试试这个:

sed '/^[123]/ d' infile.txt