LINUX.ORG.RU

Дурацкий вопрос по обработке файла регулярными выражениям

 


0

1

Я пока слабоват в этом вопросе, поэтому прошу опытных людей подсказать две конструкцию из области sed, grep, и т.д.,

1. выводящую файл от начала до строки, содержащей некое выражение (не включая эту строку).

2. выводящую файл от строки, содержащей некое выражение (не включая эту строку) до конца.

Заранее спасибо.

★★★★

Последнее исправление: piyavking (всего исправлений: 2)

Ответ на: комментарий от leonidko

Есть файл file, в нём строки. В какой-то из строк есть выражение 'выражение'. Я хочу вывести строки от первой строки до строки, содержащей это выражение, не включая эту строку.

Жаль, что для понимания этого вопроса требуются телепатические способности.

piyavking ★★★★
() автор топика

1: Вывод файла от начала до строки, содержащей некое выражение (не включая эту строку).

$ sed '/3/,+9999 s/.*/notme/' | grep -v notme

2: Вывод файла от строки, содержащей некое выражение (не включая эту строку), до конца.

$ sed '0,/3/ s/.*/notme/' | grep -v notme

Наверняка есть более простые способы.

Кстати что надо-то? Исключить одну строку?

ziemin ★★
()

grep -v - показать строки НЕ СОДЕРЖАЩИЕ «запрос».

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от ziemin

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

piyavking ★★★★
() автор топика
Ответ на: комментарий от piyavking

А заменить?

$ sed 's/^SOURCESTRING$/^RESULTSTRING$/'

Правда заменит все строки, а не первую.

ziemin ★★
()

Я пока слабоват в этом вопросе, поэтому прошу опытных людей подсказать две конструкцию из области sed, grep, и т.д., выводящую файл от начала до строки, содержащей некое выражение (не включая эту строку).

$ zcat /usr/man/man1/tar.1.gz | sed '/update/Q' выводит man tar до строки со словом «update», но эту строку не выводит. Да, нужна gnu tar.

emulek
()
Ответ на: комментарий от ziemin

$ sed '/3/,+9999 s/.*/notme/' | grep -v notme

facepalm

смени +9999 на доллар «$».

emulek
()
Ответ на: комментарий от ziemin

не учи рыбку плавать, а меня sed:

These commands are specific to GNU `sed', so you must use them with care and only when you are sure that hindering portability is not evil. They allow you to check for GNU `sed' extensions or to do tasks that are required quite often, yet are unsupported by standard `sed's.

emulek
()
Ответ на: комментарий от ziemin

конечно речь шла про gnu sed, а tar тут вообще не причём, очепятался.

emulek
()
Ответ на: комментарий от emulek

не учи рыбку плавать, а меня sed:

В твоём сообщении речь шла о tar.

ziemin ★★
()
Ответ на: комментарий от generator

'/regexp/,$d'

Хитро́, я даже не сразу распарсил, что $ и d по идее отдельно.

Deleted
()
Ответ на: комментарий от DELIRIUM

А ещё, если надо вывести сразу и 1) и 2), без первого совпадения с регуляркой, то можно вот так извращнуться:

$ sed -e '0,/regexp/{s/regexp//}' file |egrep -ve '^$'

Но в общем случае с perl (или awk) будет работать быстрее.

UPD. Протупил:

$ sed -e '0,/regexp/{/regexp/d}' file
DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 2)
Ответ на: комментарий от anonymous

-c подавляет вывод и просто подсчитывает количество совпадений. Опция не принимает аргументов. Ты сам запускать-то пробовал? А ещё это опция есть только в GNU grep.

DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.