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

我将如何在sed中混合模式和数字范围(或者任何类似的工具 – 例如awk)? 我想要做的是匹配文件中的某些行,并在继续之前删除接下来的n行,我想将其作为stream水线的一部分。

我会去的

删除图案后的5行(包括图案的行):

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

在模式后删除5行(不包括模式的行):

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

简单的awk解决scheme:

假设用于查找匹配行的正则expression式存储在shellvariables$regex ,并且要在$count跳过的行$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"定义基于同名variables的awkvariables。
  • $0 ~ regex匹配感兴趣的行
    • { skip=count; next } { skip=count; next }初始化跳过计数并进入下一行,有效地跳过匹配行; 在第二种解决scheme中, next之前的print确保它不被跳过。
    • --skip >= 0递减跳跃计数,如果(仍然)> = 0则采取行动,意味着应该跳过手边的线。
    • { next }进入下一行,有效地跳过当前行
  • 1{ print }常用的简写forms; 也就是说,当前行是简单的打印
    • 只有不匹配和未跳过的行才能达到此命令。
    • 1等同于{ print }1被解释为一个布尔模式,根据定义总是计算为true,这意味着其相关的操作(块)被无条件地执行。 由于在这种情况下没有相关的操作,所以awk默认打印行。

这个解决scheme允许你传递“n”作为参数,它将从文件中读取你的模式:

 awk -vn=5 ' NR == FNR {pattern[$0]; next} { for (patt in pattern) { if ($0 ~ patt) { print # remove if you want to exclude a matched line for (i=0; i<n; i++) getline next } } print } ' file.with.patterns - 

名为“ – ”的文件表示awk的stdin,所以这适用于你的pipe道

这可能适合你:

 cat <<! >pattern_number.txt > 5 3 > 10 1 > 15 5 > ! sed 's|\(\S*\) \(\S*\)|/\1/,+\2{//!d}|' pattern_number.txt | sed -f - <(seq 21) 1 2 3 4 5 9 10 12 13 14 15 21