그것을 사용할 때MK, GNU sed, 변수가 전혀 확장되지 않는 것을 발견했습니다.
문제의 코드:
VAR=qux
...
build:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
이것은 다음을 실행하는 것 같습니다:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
내가 실행하고 싶을 때
sed -i "s|FOO = .*|FOO = qux|" bar.file
다른 스택 교환 게시물에서 언급했듯이 작은따옴표와 큰따옴표를 사용해 보았습니다. 확장할 수 있는 유일한 경우 $VAR
는 주위에 따옴표가 없는 경우입니다. 이는 물론 sed
표현이 더 이상 표현으로 간주되지 않음을 의미합니다.
답변1
이것은 Makefile의 일부처럼 보입니다.
파일에 두 가지 오류가 있습니다.
바꾸기 명령은 구분 기호로
sed
사용되지만|
중간 구분 기호는 입니다/
.Makefile 변수는 ORed 가 아닌
VAR
역참조됩니다 .$VAR
$(VAR)
${VAR}
Makefile은 쉘 스크립트가 아닙니다. 따라서 다음 Makefile은 완전히 유효하며 qux world
터미널에서 출력으로 문자열을 생성합니다 .
VAR= qux
build:
@echo 'hello world' | sed 's|hello|$(VAR)|'
Unix Makefile에서는 $VAR
변수 값으로 확장되고 V
그 뒤에 문자가 옵니다 AR
. 달리 명시하지 않는 한 변수 이름은 단일 문자이기 때문입니다. 다중 문자 변수 이름이 있는 경우 전체 이름을 $(...)
또는 로 묶어야 합니다 ${...}
.
분명히 Plan9 Makefile은 이와 관련하여 다를 수 있습니다.
고쳐 쓰다:
2.0을 사용하는 경우 다음은 mkfile
올바른 값을 출력합니다.mk
hello = qux
VAR=qux
all:
echo "hello = bar" | sed "s/= bar/= $VAR/"
그래서 질문의 인용문이 나에게 맞는 것 같습니다.
답변2
이전에 이스케이프를 시도했지만 실수로 다음과 같이 큰따옴표를 넣었습니다.
sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file
그것을로 바꾸다
sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file
일하다.