Acontece que, apesar de eu ter tentado anteriormente escapar dele, eu erroneamente coloquei aspas duplas assim:
sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file
Alterando para
sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file
funciona.
Ao usar mk , o GNU sed, eu acho que as variáveis não se expandem de forma alguma.
Código problemático:
VAR=qux
...
build:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
Isso parece rodar o seguinte:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
quando eu quero que ele seja executado
sed -i "s|FOO = .*|FOO = qux|" bar.file
Eu tentei usar aspas simples e aspas duplas, como outros posts de troca de pilha mencionaram. A única instância que posso obter $VAR
para expandir é quando não há cotações em torno dele. O que obviamente significa que sed
não vê mais a expressão como uma expressão.
Isto parece um fragmento em um Makefile.
Existem dois erros no arquivo:
O comando sed
de substituição usa |
como delimitador, mas o delimitador médio é /
.
A variável do Makefile VAR
é desreferenciada como $VAR
em vez de $(VAR)
ou ${VAR}
.
Note que um Makefile não é um script de shell. Portanto, o Makefile a seguir é perfeitamente válido e produzirá a string qux world
como saída no terminal:
VAR= qux
build:
@echo 'hello world' | sed 's|hello|$(VAR)|'
Em um Makefile do Unix, $VAR
se expandiria para o valor da variável V
seguido pelas letras AR
. Isso ocorre porque, a menos que seja indicado de outra forma, os nomes das variáveis são um único caractere. Se você tiver nomes de variáveis com vários caracteres, deverá colocar o nome inteiro em $(...)
ou ${...}
.
Obviamente, os Makefiles Plan9 podem ser diferentes a esse respeito.
ATUALIZAÇÃO:
O seguinte mkfile
produz o valor correto ao usar mk
2.0, hello = qux
:
VAR=qux
all:
echo "hello = bar" | sed "s/= bar/= $VAR/"
Assim, a citação da pergunta parece correta para mim.