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的awk
variables。 -
$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