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

관련 정보