Прості awk
рішення:
Припустимо, що регулярний вираз, який використовується для пошуку відповідних рядків, зберігається в змінній оболонки $regex
, а кількість рядків, яку потрібно пропустити$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
змінні на основі однойменних змінних оболонок .
$0 ~ regex
відповідає лінії інтересу
{ skip=count; next }
ініціалізує кількість пропусків і переходить до наступного рядка, ефективно пропускаючи відповідну лінію; у 2-му розв’язку print
попереднє next
гарантує, що воно є не буде пропущено.
--skip >= 0
зменшення кількості пропусків і вживає заходів, якщо це (все-таки)> = 0, маючи на увазі, що поруч слід пропустити лінію.
{ next }
переходить до наступного рядка, фактично пропускаючи поточний рядок
1
- це часто використовувана стенограма для { print }
; тобто поточний рядок просто друкується
- Тільки невідповідні та пропущені рядки досягають цієї команди.
- Причина,
1
еквівалентна { print }
тому, що 1
інтерпретується як булева модель, яка за визначенням завжди оцінюється як істина, а це означає, що пов'язана з нею дія (блок) беззастережно виконується. Оскільки в цьому випадку жодної асоційованої дії немає , awk
за замовчуванням друкується рядок.
+N
шаблон є розширенням GNU. Змініть першийn
на наN
другий приклад, щоб він включав рядок з малюнком.