3 回答
TA贡献1839条经验 获得超15个赞
我会去解决的。
要删除模式后的5行(包括带有模式的行):
sed -e '/pattern/,+5d' file.txt
要删除模式后的5行(不包括带有模式的行):
sed -e '/pattern/{n;N;N;N;N;d}' file.txt
TA贡献1831条经验 获得超9个赞
简单的awk解决方案:
假定用于查找匹配行的正则表达式存储在shell变量中$regex,而要跳过的行数也存储在shell变量中$count。
如果还应该跳过匹配的行(也跳过$count + 1行):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
如果不应该跳过匹配的行(跳过匹配之后的$count行):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
说明:
-v regex="$regex" -v count="$count"awk基于同名的shell变量定义变量。
$0 ~ regex 符合兴趣线
{ skip=count; next }初始化跳过计数并前进到下一行,有效地跳过匹配的行;在第二个解决方案中,print之前next确保不跳过它。
--skip >= 0 减少跳过计数并在(仍然)> = 0时采取措施,这意味着应跳过当前行。
{ next } 前进到下一行,有效跳过当前行
1是常用的简写{ print }; 也就是说,仅打印当前行
只有不匹配和不跳过的行才能到达此命令。
其原因1是相当于{ print }是1被解释为布尔图案,根据定义总是评估为真,这意味着被无条件地执行其相关联的动作(块)。由于在这种情况下没有关联的操作,因此awk默认情况下将打印该行。
TA贡献1876条经验 获得超7个赞
使用Perl
$ cat delete_5lines.txt
1
2
3
4
5 hello
6
7
8
9
10
11 hai
$ perl -ne ' BEGIN{$y=1} $y=$. if /hello/ ; print if $y==1 or $.-$y > 5 ' delete_5lines.txt
1
2
3
4
11 hai
$
- 3 回答
- 0 关注
- 833 浏览
添加回答
举报