continue to build Luna Park ))сразу хочу заметить, что всё дальнейшее уже для ТС не актуально, он уже решение для себя на Сях написал
но вдруг кому пригодится, хотя у меня конечно есть сильное подозрение, что это такой секрет Полишинеля ))
итак, есть какой-либо текст и в нём нужно заменить/удалить какой-либо фрагмент текста или слово
причём этот фрагмент текста или слово повторяется в тексте неоднократно
но удаление/замену нужно выполнить после определённого текста/слова в данном тексте
например в следующем тексте нужно заменить слово cat на слово DOG
но заменить нужно первое вхождение после определённого текста,
в данном случае пусть это будет слово replace
it is a simple text containing the word cat and other words
the word cat is found in this text several timesthis text is divided into several paragraphs
this is the word cat and the word cat yet
need to replace the word cat with the word DOG
but you need to replace the first occurrence of the word cat after the word "replace"
please do not touch the other cats
the other words in the text of the cat does not replace
the rest of the text remains unchanged
для того чтобы прочесть текст одним куском установим разделитель в неопределённое значение
#!/usr/bin/perllocal $/ = undef;
$file = <>;
$file =~ s/(replace(?:(?!cat)).*?)cat/$1DOG/s;
print $file;
ну и разумеется, однострочник, куда же без него ))
нужно использовать ключик -0777 чтобы заставить читать весь файл сразу одним куском
ну и знак "!" в FreeBSD необходимо экранировать
получится perl -0777 -pe 's/(replace(?:(?\!\cat)).*?)cat/$1DOG/s' text
а так можно заменить/удалить просто первое вхождение кота perl -0777 -pe 's/((?:(?\!\cat)).*?)cat/$1DOG/s' text
возвращаясь к первоначальной задаче топикстартера всё это приобретает следующий вид
#!/usr/bin/perllocal $/ = undef;
$file = <>;
$file =~ s/(db_table\s=\su'type'(?:(?!self\.name)).*?)self\.name/$1self\.displayname/s;
print $file;
и это всё без регистрации и смс, безо всяких там условностей и ограничений ))
в однострочном варианте выглядит не так красиво и изящно как хотелось бы, вылезают косяки с одинарными кавычками
решение подсмотрел здесь же на opennet'е ==> http://www.opennet.dev/tips/info/2393.shtml
env re="'" perl -0777 -pe 's/(db_table = u$ENV{re}type$ENV{re}(?:(?\!self\.name)).*?)self\.name/$1self\.displayname/s' txt
использование -i.bak заставит perl переписать исходный текст и скопировать исходный вариант в файл txt.bak
env re="'" perl -i.bak -0777 -pe 's/(db_table = u$ENV{re}type$ENV{re}(?:(?\!self\.name)).*?)self\.name/$1self\.displayname/s' txt
повторю - это уже неважно, но всё же, вдруг пригодится кому-то ещё
такие дела