Как мне смешивать шаблоны и числовые диапазоны в sed (или другом подобном инструменте - например, awk)? Я хочу сопоставить определенные строки в файле и удалить следующие n строк перед тем, как продолжить, и я хочу сделать это как часть конвейера.
106
+N
шаблон является расширением GNU. Измените первыйn
наN
второй во втором примере, чтобы он включал линию с узором./pattern/,+5
определяет диапазон, который начинается со строки, содержащей «шаблон» (/pattern/
), и заканчивается на 5 строк позже (+5
). Последний символd
- это команда, запускаемая в каждой строке в этом диапазоне, то есть «удалить». Во втором рецепте вместо сопоставления диапазона он сопоставляется только со строкой, содержащей шаблон (/pattern/
), а затем запускает серию команд:,{n;N;N;N;N;d}
которая в основном печатает следующую строку (n
), а затем считывает и, наконец, отбрасывает следующие 4 строки (N;N;N;N;d
).sed -e '/pattern/{n;N;N;N;N;d;}' file.txt
something
выполните:,sed -E '/^something$/,$d'
где-E
- расширенное регулярное выражение переносимости POSIX.Без расширений GNU (например, в macOS):
Чтобы удалить 5 строк после шаблона (включая строку с шаблоном)
Добавить
-i ''
для редактирования на месте.источник
Простые
awk
решения:Предположим, что регулярное выражение, используемое для поиска совпадающих строк, хранится в переменной оболочки
$regex
, а количество строк, которые нужно пропустить$count
.Если совпадающая строка также должна быть пропущена (
$count + 1
строки пропускаются):Если совпавшая строка должна не быть пропущена (
$count
строки после матча пропускается):Пояснение:
-v regex="$regex" -v count="$count"
определяетawk
переменные на основе одноименных переменных оболочки .$0 ~ regex
соответствует интересующей линии{ skip=count; next }
инициализирует счетчик пропусков и переходит к следующей строке, фактически пропуская соответствующую строку; во втором решенииprint
предыдущийnext
гарантирует, что он не будет пропущен.--skip >= 0
уменьшает счетчик пропусков и принимает меры, если он (все еще)> = 0, что означает, что данную строку следует пропустить.{ next }
переходит к следующей строке, фактически пропуская текущую строку1
это обычно используемое сокращение для{ print }
; то есть текущая строка просто печатается1
эквивалентна,{ print }
заключается в том, что1
она интерпретируется как логический шаблон, который по определению всегда принимает значение true, что означает, что связанное с ним действие (блок) выполняется безоговорочно. Поскольку в этом случае нет связанных действий, поawk
умолчанию выполняется печать строки.источник
Это может сработать для вас:
источник
pattern_number.txt
- это файл с двумя столбцами, содержащий шаблон для сопоставления в первом столбце, а во втором - количество строк, которые необходимо пропустить. Перваяsed
команда преобразует файл вsed
сценарий, который выполняет соответствующее сопоставление и пропуск; этот сценарий предоставляется второй командой через-f
stdin (-
)sed
. Втораяsed
команда работает с образцом специального входного файла, сформированного из выходных данных,seq 21
чтобы продемонстрировать, что он работает.Использование Perl
источник
Это решение позволяет вам передавать "n" в качестве параметра, и оно будет читать ваши шаблоны из файла:
Файл с именем «-» означает стандартный ввод для awk, поэтому он подходит для вашего конвейера.
источник