Вы хотите вызвать функцию tcflush()
POSIX, чтобы сбросить ожидающий ввод.
Например, с:
perl -MPOSIX -e 'tcflush 0,0'
Гораздо проще заменить все содержимое файла, чем изменить многострочную -строку в кавычках внутри файла, содержащего множество других вещей, которые вы не хотите ломать.
Попробуйте поместить содержимое $variable
в файл (, например. vfile.txt
), и пусть ваш сценарий оболочки сделает что-то вроде variable="$(cat vfile.txt)"
.
Затем вы можете использовать любой метод, который хотите заменить или изменить vfile.txt
.
В 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)
соответствует либо '\''
, либо любому символу, отличному от '
. Поскольку вы знаете номер строки переменной, в которой она находится в файле 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 #####
Таким образом, вы избегаете капризов кавычек и неизвестного диапазона строк переменной $.
ХТХ