Tente isto:
sed -i -e "s/headers\['Content-Disposition'\] = \"attachment; filename=%s\" % (filename)/headers\['Content-Disposition'\] = 'attachment; filename=\"%s\"' % (filename)/g" test.txt
Eu quero substituir
headers['Content-Disposition'] = "attachment; filename=%s" % (filename)
com
headers['Content-Disposition'] = 'attachment; filename="%s"' % (filename)
(para que o "% s" seja citado duas vezes).
Meu melhor esforço até agora é
sed -i -e 's/"headers[\'Content-Disposition\'] = \"attachment\; filename=%s\" % \(filename\)"/"headers[\'Content-Disposition\'] = \'attachment\; filename=\"%s\"\' % \(filename\)"/g' test.txt
mas falha:
sed: -e expression #1, char 33: unterminated 's' command
Eu tentei tudo o que pude encontrar em stackoverflow e em outros lugares. Eu tentei escapar das citações também. Mas isso muito de aspas simples e duplas está causando erros.
Eu examinei a linha e tenho certeza de que não deixei nenhuma referência não terminada. Como posso fazê-lo funcionar?
Você pode evitar "'citando o inferno'" colocando seus comandos sed em um arquivo. Então eles não estão sujeitos a cotações Bash, e você só precisa se preocupar com o que é significativo para 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
}
Assumindo que input
é um arquivo que contém os dados:
sed "y/\"/'/;s/%s/\"&\"/" input
Embora já exista uma resposta aceita, eis outra variante (um pouco mais curta):
sed -r "s/\"([a-z])/'/; s/([a-z])\"/'/; s/=([^[:space:]]{2})/\"\"/" headers
headers['Content-Disposition'] = 'attachment; filename"%s"' % (filename)
Você provavelmente poderia torná-lo ainda mais conciso, mas eu escolho dividir o sed em três partes distintas para torná-lo pelo menos um pouco mais legível!
sed --version
sed (GNU sed) 4.2.2
Tags sed