Makefile의 여러 줄 sed

Makefile의 여러 줄 sed

sed사용할 것이 하나 있습니다 Makefile. 터미널에서 작동합니다. 명령은

sed -n '/[{]/,/[}]/{
p
/[}]/a\
 //end of block matching brace
}' myfile.txt

이로 인해 다음과 같은 오류 메시지가 나타납니다 make.

/bin/sh: 2: Syntax error: Unterminated quoted string

백슬래시를 추가하거나 모든 것을 한 줄에 넣으면 다음과 같은 결과가 나옵니다.

sed: -e expression #1, char 14: extra characters after command

어떤 도움이라도 대단히 감사하겠습니다.

답변1

노력하다

$ sed -n -e '/[{]/,/[}]/{p; /[}]/ a\ //end of block matching brace' -e' }' file
{sdfg
If I add backslashes or place everything on one line I get
df }
 //end of block matching brace

-e추가된 텍스트를 종료해야 하므로 두 가지 (표현식) 옵션이 필요합니다 . 모든 sed버전에서 같은 줄에 텍스트를 추가하는 것을 허용하는 것은 아닙니다(제 GNU는 sed허용하지만 FreeBSD는 sed허용하지 않습니다).

답변2

makefile의 줄 바꿈, 백슬래시(특히)에 문제가 있을 때마다 Gsed의 명령을 사용합니다. 더 중요한 것은 Posix sed 내에 머물 수 있다는 것입니다.

$ sed -e '/[{]/,/[}]/!d' -e '/[}]/G' -e 's|\n|&//end of block matching brace|' myfile.xt

답변3

Gnu make 및 허용 쉘을 사용하면 make가 외부 레시피를 다르게 처리하므로 $''중간 변수를 사용할 수 있습니다 .\eol

make  -f - <<\!
define mycmd
sed -n $$'/[{]/,/[}]/{\n\
p\n\
/[}]/a\\\n\
 //end of block matching brace\n\
}' myfile.txt
endef

.PHONY: default
default:
        $(mycmd)
!

각 행이 \n\추가되고 단일 행이 \두 배가 됩니다. Make는 \eol외부 수식을 공백으로 변환하여 모든 것이 한 줄로 끝나도록 하며, 그런 다음 쉘은 실제 개행 문자로 $''변환합니다 . 변수를 설정하는 데 \n사용할 필요는 없습니다 . 비슷하게 작동합니다.defineMYCMD = sed...

관련 정보