Se eu executar esses comandos a partir de um script:
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
está bem.
Mas, se eu correr:
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
Eu li em tutoriais que para substituir variáveis de ambiente do shell, é necessário parar e 'citar' a $varname
parte para que não seja substituída diretamente, o que eu fiz e que funcionará apenas se a variável for definida imediatamente antes.
Como posso o sed reconhecer uma $var
variável de ambiente conforme definida no shell?
set -x
no shell para fazer com que o shell ecoe cada comando antes de executá-los. Isso pode esclarecer muita confusão. (Além disso, muitas vezes eu usoset -u
para fazer de-referenciando variáveis unset um erro de disco (Veja.set -e
Também).)Respostas:
Seus dois exemplos parecem idênticos, o que dificulta o diagnóstico de problemas. Problemas potenciais:
Você pode precisar de aspas duplas, como em
sed 's/xxx/'"$PWD"'/'
$PWD
pode conter uma barra, caso em que você precisa encontrar um caractere não contido$PWD
para usar como delimitador.Para resolver os dois problemas ao mesmo tempo, talvez
fonte
Além da resposta de Norman Ramsey, gostaria de acrescentar que você pode citar duas vezes a sequência inteira (o que pode tornar a declaração mais legível e menos propensa a erros).
Portanto, se você quiser procurar por 'foo' e substituí-lo pelo conteúdo de $ BAR, poderá colocar o comando sed entre aspas duplas.
No primeiro, $ BAR não será expandido corretamente, enquanto no segundo $ BAR será expandido corretamente.
fonte
"2,$s/^/$foo/"
as$s
interpretadas como variáveis também e não deve.Você pode usar outros caracteres além de "/" em substituição:
fonte
sed
como vomitar devido à interpretação/
do conteúdo de $ 2. Era exatamente isso que eu precisava para superar isso. Obrigado por uma ótima dica!Outra alternativa fácil:
Como
$PWD
geralmente contém uma barra/
, use em|
vez de/
para a instrução sed:fonte
$PWD
...?Com a sua edição de perguntas, vejo seu problema. Digamos que o diretório atual seja
/home/yourname
... neste caso, seu comando abaixo:será expandido para
o que não é válido. Você precisa colocar um
\
personagem na frente de cada um/
no seu $ PWD, se quiser fazer isso.fonte
mau caminho: alterar delimitador
talvez essa não seja a resposta final,
você não pode saber em que caractere ocorrerá
$PWD
,/
:
OU@
.o bom caminho é substituir o caractere especial
$PWD
.bom caminho: delimitador de escape
por exemplo: tente substituir
URL
como $ url (tem:
/
conteúdo)na string $ tmp
uma. use
/
como delimitadorOU
b. use
:
como delimitador (mais legível que/
)fonte
Na verdade, a coisa mais simples (pelo menos no gnu sed) é usar um separador diferente para o comando sed substitution (s). Portanto, em vez de s / pattern / '$ mypath' / ser expandido para s / pattern // my / path / que obviamente confundirá o comando s, use s! Pattern! '$ Mypath'! que será expandido para s! pattern! / my / path! Eu usei o caractere bang (!) (Ou use o que você quiser) que evita a barra dianteira usual, mas por nenhum meio, sua única escolha como separador.
fonte
onde VAR contém o que você deseja substituir o campo
fonte
Lidando com VARIÁVEIS dentro do sed
fonte
Eu tive um problema semelhante, eu tinha uma lista e preciso criar um script SQL com base no modelo (que continha
@INPUT@
como elemento a ser substituído):fonte