SED (SED - идентификация предыдущей строки)
Модератор: Bizdelnick
-
- Сообщения: 2
SED
Добрий день
Прошу помощи ...
Как идентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки.
Sed имеет диапазон (Выбирать только строки между некоторыми выражениями ) од qwertyuiop до asdfghjklpo
Нужго идетнифицировать строку mnbvcxzlkj как предыдущею строку перед целевой и удалить все что после этой предыдущей строки.
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
Прошу помощи ...
Как идентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки.
Sed имеет диапазон (Выбирать только строки между некоторыми выражениями ) од qwertyuiop до asdfghjklpo
Нужго идетнифицировать строку mnbvcxzlkj как предыдущею строку перед целевой и удалить все что после этой предыдущей строки.
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
Re: SED
А что именно не получается? Ожидание готовых решений здесь не приветствуется.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: SED
Идентифицировать такую строку не получится, sed ведь по одной строке обрабатывает. Помещайте каждую строку в hold space, а печатайте при обработке следующей. Когда доберётесь до нужной строки, выходите без печати.
Можно и по-другому как-нибудь, конечно. Это просто первый вариант, который пришёл в голову.
Можно и по-другому как-нибудь, конечно. Это просто первый вариант, который пришёл в голову.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
- Сообщения: 2
Re: SED
А я и не говорил что мне нужно готовое решение ...
Я не понимаю а точнее Не могу дентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки.
Есть цикл которий проходит файн в котором выбираются только строки между некоторыми выражениями.
Когда хочу получить строки между некоторыми выражениями то все в порядке.
Но когда хочу сдулать тоже самое но + идентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки то цикл перестает брать диапазон второго виражение копирует всьо до конца и так циклично по несколько раз, и файн имеет много ненужних дупликатов.
Текст :
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
Нужно
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
A а результат как би проходит но перестает брать диапазон второго виражение копирует всьо до конца і так по 4 раза (пример више)
Re: SED
Решение "в лоб", которое предложил Bizdelnick - вполне рабочее. А что нужно именно Вам - знать только Вам.
Обычно пишут: "попробовал вот так (пример кода) - не работает, попробовал так (пример кода) - низкая скорость" и так далее. А просто приводить наборы рандомных строк = проблему не решить. Имхо.
Обычно пишут: "попробовал вот так (пример кода) - не работает, попробовал так (пример кода) - низкая скорость" и так далее. А просто приводить наборы рандомных строк = проблему не решить. Имхо.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: SED
KazantiP1991
Вы, похоже, недопонимаете, как работает sed. Он не обрабатывает весь текст целиком. Он читает одну строку в pattern space, выполняет команды скрипта, потом переходит к следующей строке. Поэтому адрес строки перед командой не означает, что sed должен найти строку (строки), соответствующую (соответствующие) адресу, и выполнить для неё (них) команду. Он означает, что если адрес очередной считанной строки соответствует заданному, команда будет выполнена, а если не соответствует — не будет.
Вы, похоже, недопонимаете, как работает sed. Он не обрабатывает весь текст целиком. Он читает одну строку в pattern space, выполняет команды скрипта, потом переходит к следующей строке. Поэтому адрес строки перед командой не означает, что sed должен найти строку (строки), соответствующую (соответствующие) адресу, и выполнить для неё (них) команду. Он означает, что если адрес очередной считанной строки соответствует заданному, команда будет выполнена, а если не соответствует — не будет.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: SED
grep и head будет достаточно.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: SED
Сильное заявление.
Bizdelnick писал(а): ↑05.02.2018 16:14Идентифицировать такую строку не получится, sed ведь по одной строке обрабатывает. Помещайте каждую строку в hold space, а печатайте при обработке следующей. Когда доберётесь до нужной строки, выходите без печати.
Можно и по-другому как-нибудь, конечно. Это просто первый вариант, который пришёл в голову.
Похоже, меня несколько сбила с толку постановка вопроса. Всё гораздо проще: надо выйти (q) при нахождении заданной строки.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: SED
grep PATTERN → line_number
head line_number - 1
ТС просил удалить все после предыдущей строки.
head line_number - 1
Всё гораздо проще, надо просто выйти (q) при нахождении заданной строки.
ТС просил удалить все после предыдущей строки.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: SED
Это ещё шеллом надо обмазать и какой-то третьей утилитой извлечь цифирь из выхлопа grep.
И что не так? После предыдущей == начиная с текущей.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: SED
Да все так, просто ТС 2х слов связать не может оказывается.
Re: SED
и чего только люди не придумают, лишь бы не изучить -- один раз и надолго -- какой-нибудь более подходящий инструмент, например perl или lua
А насчёт grep мне в голову пришёл грязный хак: grep -B 100500 ...
А насчёт grep мне в голову пришёл грязный хак: grep -B 100500 ...
Re: SED
s.xbatob, "более подходящий" инструмент для таких задач называется awk, но его нужно именно изучать. Лично мне лень.
Re: SED
awk давно ни для чего не подходит. да и sed, наверное, тоже. Они были хороши во времена, когда памяти было не более 64К, а знаменитые когда-то RK05 и их копии ISOT1370 были в лучшем случае два раздельных блина по 2.5 Мбайт.
Я эти времена застал. Правда, сидел не за телетайпом и даже не за Консулом, как кое-кто из коллег - за настоящим дисплеем ВТА-2000. Нисколько не жалею и не ностальгирую.
Re: SED
Однострочники на awk бывают очень в тему там, где на sed получился бы аццкий нечитаемый трешак, который вы еще и заколебались бы писать. Но спорить на общие темы мне крайне лениво.
- Bizdelnick
- Модератор
- Сообщения: 20794
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: SED
Единственный случай, когда awk или sed имеют смысл, — это когда надо обеспечить максимальную переносимость. Не так давно переписывал несколько скриптов, чтобы избавиться в них зависимости от perl, которого может не быть в некоторых урезанных контейнеров. В результате один perl-однострок разросся до 20–30 строк на awk, а другой скрипт в результате переписывания на sed стал совершенно нечитаемым (и с обеспечением той самой переносимости пришлось весьма основательно помучаться, потому что одно дело GNU sed, другое — BSD sed, а оба sed из Solaris — вообще полный отстой).
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |