sed найти заменить проблему

Я хочу заменить

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 и других местах. Я тоже пытался избежать кавычек. Но слишком много одинарных и двойных кавычек вызывает ошибки.

Я просмотрел строку и уверен, что не оставил незавершенных кавычек. Как мне заставить его работать?

0
07.10.2016, 11:17
4 ответа

Попробуйте это:

sed -i -e "s/headers\['Content-Disposition'\] = \"attachment; filename=%s\" % (filename)/headers\['Content-Disposition'\] = 'attachment; filename=\"%s\"' % (filename)/g" test.txt
0
28.01.2020, 02:47

Вы можете избежать "ада цитирования", поместив свои команды 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

}
1
28.01.2020, 02:47

Предполагая, что input является файлом, который содержит данные:

sed "y/\"/'/;s/%s/\"&\"/" input
0
28.01.2020, 02:47

Хотя принятый ответ уже есть, вот еще один (немного короче) вариант:

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
0
28.01.2020, 02:47

Теги

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