我想使用sed
的正则表达式从文件中删除行,就像在这个问题Delete lines in a text file that containing a specific string中一样,但只在一系列行内(不在整个文件中)。我想从一些行号开始直到文件结束。
这就是我与tail
:
tail -n +731 file|sed '/some_pattern/d' >> file
file
中已编辑的范围
仅使用sed
更短的方式吗?
像sed -i '731,1000/some_pattern/d' file
?
答案 0 :(得分:2)
您可以使用此sed
,
sed -i.bak '731,1000{/some_pattern/d}' yourfile
<强>测试强>
$ cat a
1
2
3
13
23
4
5
$ sed '2,4{/3/d}' a
1
2
23
4
5
答案 1 :(得分:2)
您需要$
地址才能匹配文件末尾。使用GNU sed:
sed -i '731,${/some_pattern/d;}' file
请注意,这可能比tail -n +number
慢,因为sed
将在文件开头处开始处理,而不是像tail
那样执行lseek()。
(使用BSD sed,您需要sed -i '' ...
)
答案 2 :(得分:0)
sed用于单个行上的简单替换,即全部。对于任何有趣甚至更有趣的东西,awk解决方案将更清晰,更强大,更便携,可维护,可扩展,并且几乎可以用于其他任何理想的软件属性。
鉴于此示例输入文件:
$ cat file
1
2
3
4
1
2
3
4
1
2
3
4
以下脚本将打印除输入文件第6行之后出现的包含数字3
的行以外的每一行:
$ awk '!(NR>6 && /3/)' file
1
2
3
4
1
2
4
1
2
4
只想在第6行和第10行之间删除?没问题:
$ awk '!(NR>6 && NR<10 && /3/)' file
1
2
3
4
1
2
4
1
2
3
4
想要将跳过的行写入日志文件吗?没问题:
awk 'NR>6 && /3/{print > "log";next} {print}' file
写给stderr?
awk 'NR>6 && /3/{print | "cat>&2";next} {print}' file
想要计算你删除的行数还写入stderr吗?
awk 'NR>6 && /3/{print | "cat>&2"; cnt++; next} {print} END{print cnt | "cat>&2"}' file
你想要做的另外或不同的任何事情都很容易,并以你的开始为基础。尝试使用满足您原始要求的sed脚本,执行上述任何操作或其他任何操作。
答案 3 :(得分:0)
要求救援!
awk '!(NR>=731 && /pattern/)' input > output