나는 바꾸고 싶다
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