sed 查找替换问题

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,字符 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

相关内容