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

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



慕森王
浏览 798回答 3
3回答

紫衣仙女

我会去解决的。要删除模式后的5行(包括带有模式的行):sed -e '/pattern/,+5d' file.txt要删除模式后的5行(不包括带有模式的行):sed -e '/pattern/{n;N;N;N;N;d}' file.txt

天涯尽头无女友

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

幕布斯6054654

使用Perl$ cat delete_5lines.txt12345 hello67891011 hai$ perl -ne ' BEGIN{$y=1} $y=$.  if /hello/ ; print if $y==1 or $.-$y > 5 ' delete_5lines.txt123411 hai$
打开App,查看更多内容
随时随地看视频慕课网APP