Я хочу заменить
headers['Content-Disposition'] = "attachment; filename=%s" % (filename)
на
headers['Content-Disposition'] = 'attachment; filename="%s"' % (filename)
(чтобы "% s" заключался в двойные кавычки) .
Мои лучшие усилия пока что
sed -i -e 's/"headers[\'Content-Disposition\'] = \"attachment\; filename=%s\" % \(filename\)"/"headers[\'Content-Disposition\'] = \'attachment\; filename=\"%s\"\' % \(filename\)"/g' test.txt
но это не удается:
sed: -e выражение # 1, char 33: unterminated `s 'command
Я перепробовал все, что мог найти в stackoverflow и других местах. Я тоже пытался избежать кавычек. Но слишком много одинарных и двойных кавычек вызывает ошибки.
Я просмотрел строку и уверен, что не оставил незавершенных кавычек. Как мне заставить его работать?
Попробуйте это:
sed -i -e "s/headers\['Content-Disposition'\] = \"attachment; filename=%s\" % (filename)/headers\['Content-Disposition'\] = 'attachment; filename=\"%s\"' % (filename)/g" test.txt
Вы можете избежать "ада цитирования", поместив свои команды sed в файл. Тогда они не подлежат цитированию Bash, и вам нужно только беспокоиться о том, что важно для sed
:
#!/bin/sed -f
# Adjust this to match as much as you need
/headers\['Content-Disposition'\] = /{
# change all double-quotes to single
y/"/'/
# now double-quote the %s argument
s/%s/"&"/g
}
Предполагая, что input
является файлом, который содержит данные:
sed "y/\"/'/;s/%s/\"&\"/" input
Хотя принятый ответ уже есть, вот еще один (немного короче) вариант:
sed -r "s/\"([a-z])/'\1/; s/([a-z])\"/\1'/; s/=([^[:space:]]{2})/\"\1\"/" headers
headers['Content-Disposition'] = 'attachment; filename"%s"' % (filename)
Вы, вероятно, могли бы сделать его еще более кратким, но я разделите sed на три отдельные части, чтобы сделать его хотя бы немного более читаемым!
sed --version
sed (GNU sed) 4.2.2