У меня есть большой файл, в котором есть специальные символы. Там есть многострочный код, который я хочу заменить sed
.
Эта:
text = "\
------ ------\n\n\
This message was automatically generated by email software\n\
The delivery of your message has not been affected.\n\n\
------ ------\n\n"
Необходимо превратить в это:
text = ""
Я попробовал следующий код, но не повезло:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Он ничего не заменяет и не отображает никаких сообщений об ошибках.
Я играл с этим, но все, что я пытаюсь, не работает.
text-processing
sed
perl
blade19899
источник
источник
sed
или вы открыты для других инструментов? Может ли быть"
внутриtext=
блока? Могут ли быть другие случаиtext =
в вашем файле? Всегда будет 4 строки текста или их будет больше / меньше?sed
или что-либо, что не требует установки на сервере CentOS. Из коробки инструментыtext =
папке нет других , выход должен бытьtext = ""
. Файлы имеют 891 строчку кода. ТАК, нужно уважать другой текст.text = ""
. Как видно из моего вопроса.Ответы:
Perl на помощь:
-i~
отредактируем файл "на месте", оставив резервную копию-0777
читает весь файл сразу, а не построчноПодстановка
s///
работает так же, как в sed (т. Е. Она совпадает сtext = "
последующим чем угодно, кроме двойных кавычек много раз, вплоть до двойных кавычек), но в этом случае она работает на весь файл.источник
Вы должны проверить пространство шаблона и продолжать тянуть в
N
строке ext, если она не совпадает, напримерс
gnu sed
вы можете написать это какЭто не очень эффективно, лучше просто выбрать диапазон
/text = "/,/"/
, изменить первую строку и удалить остальные:Опять же,
gnu sed
вы можете написать это в виде одной строки:источник
Лично я бы сделал это на Perl. Если мы можем предположить, что нет
"
до закрытия"
, вы можете сделать:-0
Хлебает весь файл, чтение его в память. В-p
означает «печать каждую строку (здесь,„линия“будет весь файл) после применения сценария дается-e
». Сам скрипт является простым оператором подстановки. Он будет захватывать строку,text
за которой следуют 0 или более пробельных символов,=
сноваtext\s*=\s*
и 0 и более пробельных символов ( ), и сохранять ее как$1
. Затем он заменит захваченный шаблон, а также самую короткую строку в кавычках, которую он найдет, на pattern ($1
) и""
.s
Флаг делает.
матч новой строки.источник
-00
читает в пунктах, а не весь файл ( ссылка ). Если текст в кавычках содержит пустую строку, то регулярное выражение не будет совпадать.perl -00ne 'print;exit'
. И я все еще ошибаюсь в своем ответе! Спасибо, исправлено.