Eu tenho um conjunto de substituições sed em um script bash e estou recebendo um erro sobre um comando `s 'não terminado. Aqui está a aparência da linha sed:
sed -n -e "s/TMPFOO1/$FOO1/" -e "s/TMPFOO2/$FOO2/" -e "s/TMPFOO3/$FOO3/" -e "s/TMPFOO4/$FOO4/" -e "s/TMPFOO5/$FOO5/" /home/foo/template > /home/foo/template/finishedresult
Por alguma razão, o bash não gosta disso e recebo um erro sobre
sed: -e expression #4, char 69: unterminated `s' command
O que estou perdendo aqui? Como posso o SED inserir a variável? Parece-me que todos eles foram encerrados.
shell-script
text-processing
sed
Mike B
fonte
fonte
Respostas:
Você não pode interpolar com segurança uma variável em um comando sed, porque a substituição é realizada pelo shell, não pelo sed. O valor da variável se torna a sintaxe sed. Por exemplo, em
"s/TMPFOO1/$FOO1/"
, se$FOO1
contiver uma nova linha, isso causará um erro de sintaxe como o que você observou. Se$FOO1
contiver a/
, isso encerrará os
comando e poderá causar um erro ou executar outros comandos (se o que se/
segue a seguir for uma sintaxe sed válida).Embora você possa fazer uma primeira substituição
FOO1
para citar seus caracteres especiais para inclusão nesse comando sed, é muito mais simples usar o awk. O Awk possui uma noção de variável e uma sintaxe de linha de comando para definir o valor inicial de uma variável.fonte
-v
precisa preceder cada declaração de variável.Provavelmente uma de suas
$FOO
variáveis contém caracteres especiais que são interpretados porsed
.Eu tenho outra versão do
sed
qual gera outras mensagens de erro, mas aqui está um exemplo de um problema semelhante:Nesse caso,
$VAR
contém um caractere que é interpretadosed
como a barra final.fonte
Como outros já mencionaram aqui, isso depende do conteúdo de suas variáveis FOO *. No seu caso, usar
sed
é a escolha errada, pois provavelmente contém alguns caracteres especiais.Dê uma olhada neste link e veja a função
gsub_literal
Como
gsub_literal
lê stdin e grava em stdout, o uso será:gsub_literal "$search" "$replace" < /home/foo/template > /home/foo/template/finishedresult
Saída de amostra:
fonte
O problema foi resolvido para mim ao tentar barras invertidas adicionais dentro do
sed 's/.../.../g'
comando. Este comandome deu essa mensagem de erro
quando foi executado como parte de um script c-shell, e somente com uma versão recente de
sed
, não com uma versão mais antiga. (Estranhamente, o mesmo comando funciona bem quando é fornecido na linha de comando (em um shell tc)).O problema com o script c-shell foi corrigido precedendo o
ä
caractere por uma barra invertida:fonte