为了账号安全,请及时绑定邮箱和手机立即绑定

sed或awk:删除模式后的n行

sed或awk:删除模式后的n行

慕森王 2019-11-13 13:44:44
如何在sed(或任何类似工具-例如awk)中混合模式和数值范围?我想做的是匹配文件中的某些行,并在继续操作之前删除下n行,我想将其作为管道的一部分进行。
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

我会去解决的。


要删除模式后的5行(包括带有模式的行):


sed -e '/pattern/,+5d' file.txt

要删除模式后的5行(不包括带有模式的行):


sed -e '/pattern/{n;N;N;N;N;d}' file.txt


查看完整回答
反对 回复 2019-11-13
?
天涯尽头无女友

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默认情况下将打印该行。


查看完整回答
反对 回复 2019-11-13
?
幕布斯6054654

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

$


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 793 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信