SED (SED - идентификация предыдущей строки)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
KazantiP1991
Сообщения: 2

SED

Сообщение KazantiP1991 »

Добрий день

Прошу помощи ...

Как идентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки.


Sed имеет диапазон (Выбирать только строки между некоторыми выражениями ) од qwertyuiop до asdfghjklpo



Нужго идетнифицировать строку mnbvcxzlkj как предыдущею строку перед целевой и удалить все что после этой предыдущей строки.

qwertyuiop
asdfghjkllkj
zxcvbnmn
mnbvcxzlkj
asdfghjklpo
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: SED

Сообщение devilr »

А что именно не получается? Ожидание готовых решений здесь не приветствуется.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: SED

Сообщение Bizdelnick »

Идентифицировать такую строку не получится, sed ведь по одной строке обрабатывает. Помещайте каждую строку в hold space, а печатайте при обработке следующей. Когда доберётесь до нужной строки, выходите без печати.
Можно и по-другому как-нибудь, конечно. Это просто первый вариант, который пришёл в голову.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
KazantiP1991
Сообщения: 2

Re: SED

Сообщение KazantiP1991 »

devilr писал(а):
05.02.2018 15:57
А что именно не получается? Ожидание готовых решений здесь не приветствуется.


А я и не говорил что мне нужно готовое решение ...

Я не понимаю а точнее Не могу дентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки.

Есть цикл которий проходит файн в котором выбираются только строки между некоторыми выражениями.

Когда хочу получить строки между некоторыми выражениями то все в порядке.

Но когда хочу сдулать тоже самое но + идентифицировать предыдущею строку перед целевой, и удалить все что после этой предыдущей строки то цикл перестает брать диапазон второго виражение копирует всьо до конца и так циклично по несколько раз, и файн имеет много ненужних дупликатов.


Текст :

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 раза (пример више)
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3667
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: SED

Сообщение devilr »

Решение "в лоб", которое предложил Bizdelnick - вполне рабочее. А что нужно именно Вам - знать только Вам.
Обычно пишут: "попробовал вот так (пример кода) - не работает, попробовал так (пример кода) - низкая скорость" и так далее. А просто приводить наборы рандомных строк = проблему не решить. Имхо.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: SED

Сообщение Bizdelnick »

KazantiP1991
Вы, похоже, недопонимаете, как работает sed. Он не обрабатывает весь текст целиком. Он читает одну строку в pattern space, выполняет команды скрипта, потом переходит к следующей строке. Поэтому адрес строки перед командой не означает, что sed должен найти строку (строки), соответствующую (соответствующие) адресу, и выполнить для неё (них) команду. Он означает, что если адрес очередной считанной строки соответствует заданному, команда будет выполнена, а если не соответствует — не будет.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
1000Mhz
Сообщения: 70
ОС: GuixSD, когда-нибудь

Re: SED

Сообщение 1000Mhz »

grep и head будет достаточно.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: SED

Сообщение Bizdelnick »

1000Mhz писал(а):
05.02.2018 19:09
grep и head будет достаточно.

Сильное заявление.

Bizdelnick писал(а):
05.02.2018 16:14
Идентифицировать такую строку не получится, sed ведь по одной строке обрабатывает. Помещайте каждую строку в hold space, а печатайте при обработке следующей. Когда доберётесь до нужной строки, выходите без печати.
Можно и по-другому как-нибудь, конечно. Это просто первый вариант, который пришёл в голову.

Похоже, меня несколько сбила с толку постановка вопроса. Всё гораздо проще: надо выйти (q) при нахождении заданной строки.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
1000Mhz
Сообщения: 70
ОС: GuixSD, когда-нибудь

Re: SED

Сообщение 1000Mhz »

grep PATTERN → line_number
head line_number - 1

Всё гораздо проще, надо просто выйти (q) при нахождении заданной строки.

ТС просил удалить все после предыдущей строки.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: SED

Сообщение Bizdelnick »

1000Mhz писал(а):
05.02.2018 19:50
grep PATTERN → line_number
head line_number - 1

Это ещё шеллом надо обмазать и какой-то третьей утилитой извлечь цифирь из выхлопа grep.

1000Mhz писал(а):
05.02.2018 19:50
ТС просил удалить все после предыдущей строки.

И что не так? После предыдущей == начиная с текущей.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
1000Mhz
Сообщения: 70
ОС: GuixSD, когда-нибудь

Re: SED

Сообщение 1000Mhz »

Bizdelnick писал(а):
05.02.2018 20:14
И что не так? После предыдущей == начиная с текущей.

Да все так, просто ТС 2х слов связать не может оказывается.

Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: SED

Сообщение s.xbatob »

и чего только люди не придумают, лишь бы не изучить -- один раз и надолго -- какой-нибудь более подходящий инструмент, например perl или lua

А насчёт grep мне в голову пришёл грязный хак: grep -B 100500 ...
Спасибо сказали:
1000Mhz
Сообщения: 70
ОС: GuixSD, когда-нибудь

Re: SED

Сообщение 1000Mhz »

s.xbatob, "более подходящий" инструмент для таких задач называется awk, но его нужно именно изучать. Лично мне лень.
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: SED

Сообщение s.xbatob »

1000Mhz писал(а):
06.02.2018 19:57
s.xbatob, "более подходящий" инструмент для таких задач называется awk, но его нужно именно изучать. Лично мне лень.

awk давно ни для чего не подходит. да и sed, наверное, тоже. Они были хороши во времена, когда памяти было не более 64К, а знаменитые когда-то RK05 и их копии ISOT1370 были в лучшем случае два раздельных блина по 2.5 Мбайт.
Я эти времена застал. Правда, сидел не за телетайпом и даже не за Консулом, как кое-кто из коллег - за настоящим дисплеем ВТА-2000. Нисколько не жалею и не ностальгирую.
Спасибо сказали:
1000Mhz
Сообщения: 70
ОС: GuixSD, когда-нибудь

Re: SED

Сообщение 1000Mhz »

Однострочники на awk бывают очень в тему там, где на sed получился бы аццкий нечитаемый трешак, который вы еще и заколебались бы писать. Но спорить на общие темы мне крайне лениво.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: SED

Сообщение Bizdelnick »

Единственный случай, когда awk или sed имеют смысл, — это когда надо обеспечить максимальную переносимость. Не так давно переписывал несколько скриптов, чтобы избавиться в них зависимости от perl, которого может не быть в некоторых урезанных контейнеров. В результате один perl-однострок разросся до 20–30 строк на awk, а другой скрипт в результате переписывания на sed стал совершенно нечитаемым (и с обеспечением той самой переносимости пришлось весьма основательно помучаться, потому что одно дело GNU sed, другое — BSD sed, а оба sed из Solaris — вообще полный отстой).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить