使用Sed使用带有模式的文件删除多行

使用Sed使用带有模式的文件删除多行,sed,raspberry-pi,Sed,Raspberry Pi,我目前正在使用sed从文件中删除具有各种模式的行和后续行,使用以下代码: sed -i -e"/String1/,+1d" -e"/String2/,+1d," filename.txt 工作得很好,但我有很多模式,随着时间的推移而变化 是否可以将所有模式放在另一个文本文件中,并使sed删除在该文件中找到的模式的所有条目 谢谢这是一个awk版本 awk 'NR==FNR {a[$0]++;next} {for (i in a) if ($0~i) f=2} --f<0' list you

我目前正在使用sed从文件中删除具有各种模式的行和后续行,使用以下代码:

sed -i -e"/String1/,+1d" -e"/String2/,+1d," filename.txt
工作得很好,但我有很多模式,随着时间的推移而变化

是否可以将所有模式放在另一个文本文件中,并使sed删除在该文件中找到的模式的所有条目


谢谢

这是一个
awk
版本

awk 'NR==FNR {a[$0]++;next} {for (i in a) if ($0~i) f=2} --f<0' list yourfile



awk'NR==FNR{a[$0]++;next}{for(a中的i)if($0~i)f=2}--f这是一个
awk
版本

awk 'NR==FNR {a[$0]++;next} {for (i in a) if ($0~i) f=2} --f<0' list yourfile



awk'NR==FNR{a[$0]++;next}{for(a中的i)if($0~i)f=2}--f不惜一切代价坚持使用
sed
,并且具有创造性:-)

考虑使用
sed
本身生成将基于模式文件执行替换的
sed
脚本

需要注意的重要一点是,该解决方案将一次处理每个输入文件,从而可以在大文件/多个模式上使用

提议的解决办法:

sed -i -e "$(sed  -e '/\//d;s/^/\//;s/$/\/,+1d/' < patterns.txt)" filename.txt
注意事项、限制等:

(上述实现的)一个限制是分隔符,代码删除带有“/”的任何模式,以简化
sed
脚本的生成,并避免潜在的注入。可以绕过此限制并允许使用备用分隔符(通过转义模式中的特殊字符,或利用“\%”地址)。可能需要额外的测试


代码假定这些模式是有效的,因此。

尝试坚持使用sed——不惜一切代价,并且富有创造性:)

考虑使用
sed
本身生成将基于模式文件执行替换的
sed
脚本

需要注意的重要一点是,该解决方案将一次处理每个输入文件,从而可以在大文件/多个模式上使用

提议的解决办法:

sed -i -e "$(sed  -e '/\//d;s/^/\//;s/$/\/,+1d/' < patterns.txt)" filename.txt
注意事项、限制等:

(上述实现的)一个限制是分隔符,代码删除带有“/”的任何模式,以简化
sed
脚本的生成,并避免潜在的注入。可以绕过此限制并允许使用备用分隔符(通过转义模式中的特殊字符,或利用“\%”地址)。可能需要额外的测试


代码假定模式是有效的,例如:xargs-I@sed-I-e/@/,+1d”filename.txt如何格式化模式文件?我只是把每个模式放在单独的一行吗?
/String2/,+d,
你确定这不是打字错误吗?你可以用:
xargs-I@sed-I-e/@/,+1d”filename.txt来近似它(效率稍低):如何格式化模式文件?我是否简单地将每个模式放在单独的一行上?问题并不完全清楚需要什么,但需要注意的是,这段代码将模式视为正则表达式,而不是固定字符串。如果需要固定字符串,则正则表达式特殊字符可能会导致意外输出。例如,
Hello?
还将删除只包含
Hell
的行。问题并不完全清楚需要什么,但需要注意的是,该代码将模式视为正则表达式,而不是固定字符串。如果需要固定字符串,则正则表达式特殊字符可能会导致意外输出。例如,
Hello?
还会删除只包含
Hell
sed -i -e "$(sed  -e '/\//d;s/^/\//;s/$/\/,+1d/' < patterns.txt)" filename.txt
pattern.txt:
three
eight
foo/bar

Output: (noticed foo/bar ignored - contains '/')
/three/,+1d
/eight/,+1d