В Sed есть команды, отличные от s
. Вы можете найти начальную строку, удалить все строки до последней части значения и вставить новое значение. Однако правильно цитировать сложно — обратите внимание, что s/…/$mynewvariable/
не работает не только с символами новой строки, но и с '
, \
и /
. На Perl это сделать проще.
Если файл не слишком велик и не помещается в памяти, скажите Perl прочитать весь файл, а не разбивать его построчно. Непроверенный.
mynewvariable=$mynewvariable perl -0777 -i -p -e '
$replacement = $ENV{mynewvariable};
$replacement =~ s/\x27/\x27\\\x27\x27/g;
s/^variable=\x27(?:[^\x27]|\x27\\\x27\x27)*\x27/$replacement/;
' "HOME/script.bash"
Пояснения:
perl -0777 -i -p
запускает программу Perl с содержимым файла, затем заменяет файл. -0777
означает обработку всего файла за один раз, а не построчно. sed s/…/$mynewvariable/
не работает ). \x27
— это одинарная кавычка (Я поместил код Perl в одинарные кавычки, поэтому я не могу использовать одинарную кавычку внутри ). $replacement =~ …
заменяет '
в значении на '\''
, что означает '
внутри одного -строкового литерала оболочки в кавычках. (?:[^\x27]|\x27\\\x27\x27)
соответствует либо '\''
, либо любому символу, отличному от '
.