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