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) Спасибо еще раз :-)
|