我想更换
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,字符 33:未终止的“s”命令
我尝试了在 stackoverflow 和其他地方能找到的所有方法。我也尝试转义引号。但是过多的单引号和双引号会导致错误。
我已经扫描了该行,并且确信我没有留下任何未终止的引号。我怎样才能让它工作?
答案1
您可以通过将 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
}
答案2
尝试这个:
sed -i -e "s/headers\['Content-Disposition'\] = \"attachment; filename=%s\" % (filename)/headers\['Content-Disposition'\] = 'attachment; filename=\"%s\"' % (filename)/g" test.txt
答案3
假设input
是一个保存数据的文件:
sed "y/\"/'/;s/%s/\"&\"/" input
答案4
尽管已经有了一个公认的答案,但这里还有另一个(更短的)变体:
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