Не преувеличено ли использование памяти типичным программным обеспечением?

В 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означает обработку всего файла за один раз, а не построчно.
  • Я передаю переменную через среду, потому что вставка ее в программу Perl приведет к тому, что она будет интерпретирована как код Perl, а не как строка (это та же причина, по которой sed s/…/$mynewvariable/не работает ).
  • \x27— это одинарная кавычка (Я поместил код Perl в одинарные кавычки, поэтому я не могу использовать одинарную кавычку внутри ).
  • $replacement =~ …заменяет 'в значении на '\'', что означает 'внутри одного -строкового литерала оболочки в кавычках.
  • (?:[^\x27]|\x27\\\x27\x27)соответствует либо '\'', либо любому символу, отличному от '.
0
25.10.2021, 22:20
0 ответов

Теги

Похожие вопросы