Здравствуйте.Пожалуйста, помогите, второй день мучаюсь....
Дело такое:
Необходимо в скрипте 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Все возвращают от начала до первой строки, содержащей выражение, а мне надо до послейней...
А... ну или просто как-то заменить или удалить все с последней строки, содержащей выражение, до конца файлаТоже пробовал и тоже такой же результат.. чего-то я не догоняю ((((
>Все возвращают от начала до первой строки, содержащей выражение, а мне надо
>до послейней...tac dump.sql |sed -n '/UNLOCK/,$p'|tac
>>Все возвращают от начала до первой строки, содержащей выражение, а мне надо
>>до послейней...
>tac dump.sql |sed -n '/UNLOCK/,$p'|tacsed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}' dump.sql
>>>Все возвращают от начала до первой строки, содержащей выражение, а мне надо
>>>до послейней...
>>tac dump.sql |sed -n '/UNLOCK/,$p'|tac
>
>sed -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}' dump.sqlСпасибо огромное...
Ну как? где почитать нормальную документацию об всех этих спецификаторах? я себе чуть голову не сломалИ еще...
Я кое что понял тут, но все же, если не трудно, не могли бы вы расписать что здесь к чему?
>>>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 -n 'H;/UNLOCK/{x;s/\n//;p;s/.*//;x}'
H - "читать и накапливать строки в буфере"
Если найдено /UNLOCK/,
x - работаем с буфером вместо текущей строки
s/\n// - зачем-то.. удаляем переводы строк
p - печатаем все
s/.*// - очищаем буфер
x - опять работаем с текущей строкойКак-то так? или неточно?
>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)
Искусство сноповязания в UNIX Shell :)Я тоже когда то тихо ох.. от таких конструкций.
А теперь даже не нахожу их странными, человек от ко всему привыкает :)
>[оверквотинг удален]
>
>Конец ЕСЛИ...
>
>Конец неявного ЦИКЛА для каждой строки.
>Sed-у ключём -n сказано в конце цикла не печатать то, что осталось
>во вх.буфере.
>
>>Как-то так? или неточно?
>
>Типа того. B)Спасибо еще раз :-)