我一直试图解决一个简单的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
提前谢谢你,
答案 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
第一个sed
将deletePattern
转换为sed
脚本,然后第二个sed
应用此脚本。
答案 3 :(得分:0)
试试这个:
sed '/^[123]/ d' infile.txt