The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Sed, разбор файла, !*! sars, 22-Май-10, 20:18  [смотреть все]
Здравствуйте.

Пожалуйста, помогите, второй день мучаюсь....

Дело такое:

Необходимо в скрипте shell выбрать все строки файла до последней строки, содержащей определенное выражение ("UNLOCK").

До первого вхождения получается, а до последнего никак

Варианты:

sed -n -e :a -e '1,/UNLOCK/{P;N;D;};N;ba' dump.sql
sed -e :a -e '$d;N;2,/UNLOCK/!ba' dump.sql -e 'P;D'
sed -rn '1,/UNLOCK/p' dump.sql

Все возвращают от начала до первой строки, содержащей выражение, а мне надо до послейней...

  • Sed, разбор файла, !*! sars, 20:26 , 22-Май-10 (1)
    А... ну или просто как-то заменить или удалить все с последней строки, содержащей выражение, до конца файла

    Тоже пробовал и тоже такой же результат.. чего-то я не догоняю ((((

  • Sed, разбор файла, !*! Andrey Mitrofanov, 22:46 , 22-Май-10 (2)
    >Все возвращают от начала до первой строки, содержащей выражение, а мне надо
    >до послейней...

    tac dump.sql |sed -n '/UNLOCK/,$p'|tac

    • Sed, разбор файла, !*! Andrey Mitrofanov, 23:08 , 22-Май-10 (3)
      >>Все возвращают от начала до первой строки, содержащей выражение, а мне надо
      >>до послейней...
      >tac dump.sql |sed -n '/UNLOCK/,$p'|tac

      sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}' dump.sql

      • Sed, разбор файла, !*! sars, 00:23 , 23-Май-10 (4)
        >>>Все возвращают от начала до первой строки, содержащей выражение, а мне надо
        >>>до послейней...
        >>tac dump.sql |sed -n '/UNLOCK/,$p'|tac
        >
        >sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}' dump.sql

        Спасибо огромное...
        Ну как? где почитать нормальную документацию об всех этих спецификаторах? я себе чуть голову не сломал

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

        • Sed, разбор файла, !*! Andrey Mitrofanov, 20:08 , 23-Май-10 (5)
          >>>tac dump.sql |sed -n '/UNLOCK/,$p'|tac
          >>sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}' dump.sql
          >Ну как? где почитать нормальную документацию об всех этих спецификаторах? я себе чуть голову не сломал

          "--Но, чёрт возьми, ка-а-ак!? --Элеметарно, Ватсон!" B-)
          Как там у Холмса было -- "многолетними упражнениями"?...
          https://www.opennet.ru/man.shtml?topic=sed&category=1

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

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

          Второй вариант - читать и накапливать прочитанные строки в буфере, пока не будет обнаружен образец. Кокда обнаружен - печатать накопленное и очистить буфер. Строки после последнего вхождения образца не печатаются, так как в конце файла буфер просто отбрасывается.

          • Sed, разбор файла, !*! sars, 23:00 , 23-Май-10 (6)
            >[оверквотинг удален]
            >>могли бы вы расписать что здесь к чему?
            >
            >Первое решение - перевернуть файл, печатать строки с первого входжения образца до
            >конца, результат снова перевернуть. Получаются строки с первой до последнего вхождения
            >образца.
            >
            >Второй вариант - читать и накапливать прочитанные строки в буфере, пока не
            >будет обнаружен образец. Кокда обнаружен - печатать накопленное и очистить буфер.
            >Строки после последнего вхождения образца не печатаются, так как в конце
            >файла буфер просто отбрасывается.

            Андрей, спасибо еще раз

            sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}'

            H - "читать и накапливать строки в буфере"

            Если найдено /UNLOCK/,
            x - работаем с буфером вместо текущей строки
            s/\n// - зачем-то.. удаляем переводы строк
            p - печатаем все
            s/.*// - очищаем буфер
            x - опять работаем с текущей строкой

            Как-то так? или неточно?

            • Sed, разбор файла, !*! Andrey Mitrofanov, 09:46 , 24-Май-10 (7)
              >sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}'

              Неявный ЦИКЛ: читать каждую следующую строку и с ней делать следующее:

              >H - "читать и накапливать строки в буфере"

              Добавить вх.буфер (очередную вх.строку) в конец "hold space" - "второго буфера" sed.

              >Если найдено /UNLOCK/,
              >x - работаем с буфером вместо текущей строки

              Обменять содержимое вх.буфера и hold space. "Работают"-то большинство команд со вх.буфером.

              >s/\n// - зачем-то.. удаляем переводы строк

              Удаляю _1_ перевод строки, первый.

              Дело в том, что в hold space в начале работы лежит этот самы перевод строки -- при _добавлении строк получается пустая строка в начале. Типа, обход особенности реализации~~


              >p - печатаем все

              Печать накопленного буфера.

              >s/.*// - очищаем буфер
              >x - опять работаем с текущей строкой

              Фактически вх.строка-то не важна уже, это очистка hold space-а (снова помещаю туда пустую строку ~ перевод строки)/

              Конец ЕСЛИ...

              Конец неявного ЦИКЛА для каждой строки.
              Sed-у ключём -n сказано в конце цикла не печатать то, что осталось во вх.буфере.

              >Как-то так? или неточно?

              Типа того. B)

              • Sed, разбор файла, !*! аноним, 19:55 , 25-Май-10 (8)
                Искусство сноповязания в UNIX Shell :)

                Я тоже когда то тихо ох.. от таких конструкций.
                А теперь даже не нахожу их странными, человек от ко всему привыкает :)

              • Sed, разбор файла, !*! sars, 01:46 , 26-Май-10 (9)
                >[оверквотинг удален]
                >
                >Конец ЕСЛИ...
                >
                >Конец неявного ЦИКЛА для каждой строки.
                >Sed-у ключём -n сказано в конце цикла не печатать то, что осталось
                >во вх.буфере.
                >
                >>Как-то так? или неточно?
                >
                >Типа того. B)

                Спасибо еще раз :-)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру