Как с помощью инструментов командной строки заменить текст, заключенный в одинарные кавычки, в несколько строк?

Вы хотите вызвать функцию tcflush()POSIX, чтобы сбросить ожидающий ввод.

Например, с:

perl -MPOSIX -e 'tcflush 0,0'
2
30.08.2019, 11:13
3 ответа

Гораздо проще заменить все содержимое файла, чем изменить многострочную -строку в кавычках внутри файла, содержащего множество других вещей, которые вы не хотите ломать.

Попробуйте поместить содержимое $variableв файл (, например. vfile.txt), и пусть ваш сценарий оболочки сделает что-то вроде variable="$(cat vfile.txt)".

Затем вы можете использовать любой метод, который хотите заменить или изменить vfile.txt.

2
27.01.2020, 22:08

В 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
27.01.2020, 22:08

Поскольку вы знаете номер строки переменной, в которой она находится в файле script.bash, вы можете сделать это:

#!/bin/bash
file="$HOME/script.bash"
mynewvariable='one
two
three'

substitute_everything_inside_variable () {
    tmpf=$(mktemp)
    printf '%s\n' "$1" |
    sed -e "s/'/'\\\''/g" -e 1s/^/variable=\'/ -e \$s/\$/\'/ > "$tmpf"
    sed -i -e "4r $tmpf"  -e '5s/^/#/' "$2"
    rm -f "$tmpf"
}

substitute_everything_inside_variable "$mynewvar" "$file"
#### eof #####

Таким образом, вы избегаете капризов кавычек и неизвестного диапазона строк переменной $.

ХТХ

0
27.01.2020, 22:08

Теги

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