Helpers - компьютеры, интернет, программирование

как удалить диапазон с разделителями регулярных выражений плюс несколько строк с помощью sed?

У меня есть файл, содержащий заголовок, от которого я хочу избавиться. У меня нет хорошего способа адресации последней строки заголовка или первой строки данных, но я могу адресовать строку перед предпоследней строкой заголовка с помощью регулярного выражения.

Пример ввода:

a bunch of make output which I don't care about
for junk in blah; do
    can't check for done!
done
for test in blurfl; do # this is the addressable line
    more garbage
done
line 1
line 2
line 3
line 4
line 5

Я сделал очевидное 1,/for test in blurfl/d, но следующие две строки не получаются. Я могу сделать команду {N;d}, которая избавится от следующей строки, но {N;N;d} просто снесет остальную часть файла, кроме последней строки, что, как я понял, связано с тем, что диапазон не поглощается и не обрабатывается как единое целое, а вместо этого обрабатывается построчно.

Я чувствую, что упускаю что-то очевидное, потому что я не знаю какой-то идиомы sed, но ни один из примеров в Интернете или в руководстве GNU не смог вызвать ничего полезного.

Я могу сделать это в awk, но другие преобразования, которые мне нужно сделать, делают awk несколько неудобным. Но GNU sed приемлем.

sed
05.01.2016

  • Другой подход заключается в том, чтобы получить номер последней удаляемой строки с помощью grep -n, а затем использовать sed для удаления строк до той, которая у вас есть. 05.01.2016
  • Как ты справился с приведенным ниже советом, Данек? 16.02.2019
  • Я откопал набор изменений, над которым, похоже, я работал, и похоже, что я использовал 1,/^for test in/{N;d}. Я не могу точно сказать, как я обошел его недостаток, хотя думаю, что в итоге я просто проигнорировал строку, которую он не удалил, и это было нормально. В принципе, я согласен с тем, что sed может быть не лучшим инструментом здесь; просто фреймворк, с которым я работал, использовал sed в качестве программы фильтрации по умолчанию, и выключение этого было бы более трудоемким, в дополнение к тому, что программа awk была намного более громоздкой, чем я хотел (чтобы уместиться в пару строк в Makefile ). 01.03.2019

Ответы:


1

Я должен не согласиться с [не] использованием awk. Все нетривиальное почти всегда проще в awk, чем sed [даже sed man-страница говорит об этом]. Лично я бы использовал perl, но...

Итак, вот скрипт awk:

BEGIN {
    phase = 0
}

# initial match -- find second loop
phase == 0 {
    if ($0 ~ /for test in blurfl/) {
        phase = 1
        next
    }
}

# wait for end of second loop
phase == 1 {
    if ($0 ~ /done/) {
        phase = 2
        next
    }
}

# print phase
phase == 2 {
    print($0)
}

Если вы хотите мучить себя [и sed] сложными изменениями, ну, предостерегайте temptor, но не говорите, что я вас не предупреждал...

05.01.2016

2

Я не думаю, что вы можете выполнять многострочные совпадения в sed. В первый раз, когда я спустился в эту кроличью нору, я в конечном итоге использовал awk, который может поддерживать, но недавно я, вероятно, использовал бы Python или Ruby для таких вещей.

05.01.2016
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..