LINUX.ORG.RU

для спецов в sed'е


0

0

Как с помощью sed'а удалить предложение разом, которое находится на трех строчках, например:


НУЖНЫЕ СЛОВА _от_сюда_нужно_удалить
______удаляем_тоже_
здесь_конец_удаления СНОВА НУЖНЫЕ СЛОВА

В одной срочке, я это прочто делал:
sed -e 's/слова_для_удаления//'

А как сделать если они на разных строчках???
anonymous

можно так, если файл подходит.

egk@topaz ~ ;) cat rub
bozo

good1 good2 bad_start ...
... too bad ...
bad_stop good3 good4

foo
legk@topaz ~ ;) echo -e `sed 's/$/\\\x01/g' rub` | sed 's/bad_start.*bad_stop//g; s/\x01\x20/\n/g'
bozo

good1 good2  good3 good4

foo
legk@topaz ~ ;)

legk
()

это awk'ом правильно делать.

dilmah ★★★★★
()

Исходный файл:
NEEDED0
NEEDED1 NEEDED2 begin blah
blah blah blah
blah 1234 end NEEDED3 NEEDED4
NEEDED5

#!/usr/bin/sed -f
:e
/./ {
        N
        s/begin.*end //
        b e
}

Chumka ★★★
()

офтоп, но ,имхо perl лучше решит эту задачу через regex

bash-3.00$ cat file.txt
...
НУЖНЫЕ СЛОВА _от_сюда_нужно_удалить
______удаляем_тоже_
здесь_конец_удаления СНОВА НУЖНЫЕ СЛОВА
...
bash-3.00$ perl -e 'use Fcntl; sysopen(MF,"./file.txt",O_RDONLY) or die($@); $/=undef; while(<MF>){ if(/(.+)\s+(НУЖНЫЕ\sСЛОВА)\s+(_от_сюда_нужно_удалить)\n(.+)\n(.+)\s+(СНОВА\sНУЖН ЫЕ\sСЛОВА)\n(.+)/){ print "$1\n$2\n$6\n$7\n";} else {print "Не смог найти\n";}}; close(MF);'
...
НУЖНЫЕ СЛОВА
СНОВА НУЖНЫЕ СЛОВА
...
bash-3.00$

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

че там расшифровывать?

:мЕтка   buffer = buffer + nextline
    if /шаблон/ then "удалить шаблон"
    goto мЕтка

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

> bash-3.00$ perl -e 'use Fcntl; sysopen(MF,"./file.txt",O_RDONLY) or 
> die($@); $/=undef; while(<MF>){ 
> > if(/(.+)\s+(НУЖНЫЕ\sСЛОВА)\s+(_от_сюда_нужно_удалить)\n(.+)\n(.+)\s+(СНОВА\sНУЖН

> ЫЕ\sСЛОВА)\n(.+)/){ print "$1\n$2\n$6\n$7\n";} else {print "Не смог 
> найти\n";}}; close(MF);' 

OMG!

$ cat test.txt
аааааа
65НУЖНЫЕ СЛОВА _от_сюда_нужно_удалить
______удаляем_тоже_
здесь_конец_удаления СНОВА НУЖНЫЕ СЛОВА56
иииииии

$ perl -0 -pe 's/НУЖНЫЕ СЛОВА(?:.*?)СНОВА НУЖНЫЕ СЛОВА//s' test.txt
аааааа
6556
иииииии

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