The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Sed, разбор файла"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Sed, разбор файла"  +/
Сообщение от sars (ok) on 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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Sed, разбор файла"  +/
Сообщение от Andrey Mitrofanov on 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

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

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

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

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Sed, разбор файла"  +/
Сообщение от Andrey Mitrofanov on 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)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Sed, разбор файла"  +/
Сообщение от аноним on 25-Май-10, 19:55 
Искусство сноповязания в UNIX Shell :)

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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