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의 줄 바꿈, 백슬래시(특히)에 문제가 있을 때마다 G
sed의 명령을 사용합니다. 더 중요한 것은 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
사용할 필요는 없습니다 . 비슷하게 작동합니다.define
MYCMD = sed...