LINUX.ORG.RU

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

 


0

1

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

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

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 ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.