The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Замена строки в файле"
Отправлено михалыч, 05-Мрт-17 12:26 
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 times

this 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/perl

local $/ = 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/perl

local $/ = undef;
$file = <>;
$file =~ s/(db_table\s=\su'type'(?:(?!self\.name)).*?)self\.name/$1self\.displayname/s;
print $file;

и это всё без регистрации и смс, безо всяких там условностей и ограничений ))

в однострочном варианте выглядит не так красиво и изящно как хотелось бы, вылезают косяки с одинарными кавычками
решение подсмотрел здесь же на opennet'е ==> http://www.opennet.ru/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

повторю - это уже неважно, но всё же, вдруг пригодится кому-то ещё

такие дела

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру