Вы можете обойти это, заменив объект (и, следовательно, связать область):
def foo(a=[]):
a = list(a)
a.append(5)
return a
Ужасно, но он работает.
Переменные внутри '
не заменяются в bash. Чтобы получить подстановку строк (или интерполяцию, если вы знакомы с perl), вам нужно будет изменить ее, чтобы использовать двойные кавычки "
вместо одиночных кавычек:
$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp
$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command
Дальнейшее чтение:
Вы можете использовать переменные, как показано ниже. Как здесь, я хотел заменить hostname
, т.е. системную переменную в файле. Я ищу строку look.me
и заменяю эту целую строку на look.me=<system_name>
sed -i "s/.*look.me.*/look.me=`hostname`/"
Вы также можете сохранить системное значение в другой переменной и можете использовать эту переменную для подстановки.
host_var=
`hostname`
sed -i "s/.*look.me.*/look.me=$host_var/"
Входной файл:
look.me=demonic
Вывод файла (при условии, что мое системное имя prod-cfm-frontend-1-usa-central-1
):
look.me=prod-cfm-frontend-1-usa-central-1
sed "s/draw($prev_number;n_)/draw($number;n_)/g"
будет ли это работать?
переменные в одинарных кавычках не расширяются, в двойных кавычках они используют двойные кавычки в этом случае.
sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp
Вы также можете заставить его работать с eval
, но не делайте этого! !
s
, но вы можете использовать любой символ пунктуации;sed "s%draw($prev_number;n_)%draw($number;n_)%g" file.txt
илиs#from#to#g
илиs_from_to_g
и т. д. – tripleee 25 June 2015 в 07:48changelogEscaped=$(sed -e 's%\/%\\/%g; $!a\'$'\n''\\n' <<<"$changelog" | tr -d '\n')
Спасибо за ссылку выше. – dentex 2 April 2018 в 10:19