URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8744
[ Назад ]

Исходное сообщение
"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 , 22-Май-10 20:26 
А... ну или просто как-то заменить или удалить все с последней строки, содержащей выражение, до конца файла

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


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

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


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

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


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

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

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


"Sed, разбор файла"
Отправлено Andrey Mitrofanov , 23-Май-10 20:08 
>>>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-Май-10 23:00 
>[оверквотинг удален]
>>могли бы вы расписать что здесь к чему?
>
>Первое решение - перевернуть файл, печатать строки с первого входжения образца до
>конца, результат снова перевернуть. Получаются строки с первой до последнего вхождения
>образца.
>
>Второй вариант - читать и накапливать прочитанные строки в буфере, пока не
>будет обнаружен образец. Кокда обнаружен - печатать накопленное и очистить буфер.
>Строки после последнего вхождения образца не печатаются, так как в конце
>файла буфер просто отбрасывается.

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

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

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

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

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


"Sed, разбор файла"
Отправлено Andrey Mitrofanov , 24-Май-10 09:46 
>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, разбор файла"
Отправлено аноним , 25-Май-10 19:55 
Искусство сноповязания в UNIX Shell :)

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


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

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