Arhn - архитектура программирования

Использование sed для печати строк между двумя шаблонами

У меня есть файл, который выглядит так:

Index: <filepath>
===================================================================
<lines to print>
<lines to print>
<lines to print>
Index: <filepath>
===================================================================
<lines to print>
<lines to print>
<lines to print>
... and so on

Мне нужно напечатать строку, начинающуюся с Index:, пропустить строку, содержащую ======, и напечатать все остальные строки до следующего экземпляра Index:

Путь к файлу каждый раз будет другим, поэтому мне нужна команда, которая будет соответствовать части Index: и печатать всю эту строку.

Я пытался использовать команду sed, но не могу заставить ее печатать нужные мне строки. Есть ли способ сделать это?

ожидаемый результат:

Index: <filepath>
<lines to print>
<lines to print>
<lines to print>
08.11.2017

  • опубликовать ожидаемый результат 08.11.2017
  • Из того, что вы описываете, вы хотите распечатать весь файл, кроме строк ======. Это то, что вы хотите сделать? 08.11.2017
  • не совсем. файл содержит один и тот же шаблон, повторяющийся много раз. Я хочу напечатать нужные строки и повторить несколько сообщений между каждым шаблоном, поэтому я планировал поместить свою команду в цикл, который выполняется до конца файла. отредактированный пример вывода на вопрос 08.11.2017

Ответы:


1

Я пришел к этой команде

sed -n '1,/^Index:/{/^Index:/!d;}; /^Index:/{x;/^$/!p;n;n;}; H; ${g;p;};'
  • Удаляет от начала до первой строки Index:
  • Затем он сохраняет в буфере хранения все, начиная с Index: до следующей Index:, за исключением строки =======, которая, как предполагается, следует за Index: сразу.
  • Когда встречается строка Index:, она печатает содержимое буфера хранения, если оно не пусто.
  • Когда достигнут конец файла, он печатает содержимое буфера хранения.

    $ cat /tmp/test
    First line
    Index: <filepath>
    ===================================================================
    <lines to print>
    <lines to print>
    <lines to print>
    Index: <filepath>
    ===================================================================
    <lines to print>
    <lines to print>
    <lines to print>
    
    $ sed -n '1,/^Index:/{/^Index:/!d;}; /^Index:/{x;/^$/!p;n;n;}; H; ${g;p;};' \
    /tmp/test
    Index: <filepath>
    <lines to print>
    <lines to print>
    <lines to print>
    Index: <filepath>
    <lines to print>
    <lines to print>
    <lines to print>
    

    Но, как упомянул Дэвид, его можно сократить, и тогда это просто

    sed '1,/^Index:/{/^Index:/!d;}; /^=/d;' /tmp/test
    

то же самое для строк перед первым Index, а затем просто удаление строк, начинающихся с =

09.11.2017
  • Разве это не эквивалентно sed '/^[=]/d' file? (кроме First line) 09.11.2017
  • Эй, я обычно делаю что-то далекое :) 09.11.2017

  • 2

    Вы можете использовать это awk:

    awk '/^Index:/{p=!p} p && !/^====/' file
    
    Index: <filepath>
    <lines to print>
    <lines to print>
    <lines to print>
    

    Подробности:

    • /^Index:/{p=!p}: когда мы находим Index: в начале, устанавливаем флаг p или сбрасываем его (эффект переключения с помощью p=!p)
    • p && !/^====/ Если флаг p равен 1 и у нас нет ==== в начале записи, распечатайте запись.

    Если вы хотите напечатать следующую строку Index:, используйте:

    awk '/^Index:/{if (p) print; p=!p} p && !/^====/' file
    
    08.11.2017
  • не могли бы вы объяснить эту команду? Возможно, в будущем мне потребуется настроить его, поэтому я хотел бы знать, что именно он делает. 08.11.2017
  • есть ли способ, которым он мог бы работать до начала следующего шаблона, то есть следующего экземпляра Index: . Шаблон повторяется до конца файла, и мне нужно распечатать несколько сообщений вместе с каждым шаблоном, поэтому я собирался поместить свою команду в цикл, который выполняется до eof, чтобы я мог печатать сообщения с каждым шаблоном. 08.11.2017
  • Можете ли вы включить лучший пример ввода с ожидаемым результатом, чтобы прояснить его. Эту команду легче настроить, но мне нужно понять проблему. 08.11.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..