sed falha com o erro “opção desconhecida para 's'”

158

Estou tentando usar

sed -i -e "s/.*seb.*/    \"$ftp_login_template\"/" $ftp_dir

no entanto, recebo este erro:

sed: -e expression #1, char 34: unknown option to `s'

Eu não entendo o porquê, pois isso funciona perfeitamente:

sed -i -e "s/.*wbspassword.*/    \"wbspassword\": \"$password\",/" $user_conf

Alguma idéia do que estou fazendo de errado?

Esse poderia ser o problema? ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"

Mr. King
fonte
8
A mensagem de erro * BSD (incluindo OSX) é "sinalizador inválido no comando substituto:" - incluindo-a aqui para tornar isso um pouco mais googlable.
Tripleee

Respostas:

355

O problema é com barras: sua variável as contém e o comando final será algo como sed "s/string/path/to/something/g", contendo muitas barras.

Como sedpode levar qualquer caractere como delimitador (sem precisar declarar o novo delimitador), você pode tentar usar outro que não apareça na sua string de substituição:

replacement="/my/path"
sed --expression "s@pattern@$replacement@"

Observe que isso não é à prova de balas: se a sequência de substituição contiver mais tarde, @ela será quebrada pelo mesmo motivo, e quaisquer seqüências de barra invertida como \1ainda serão interpretadas de acordo com as sedregras. Usar |como delimitador também é uma boa opção, pois é semelhante em legibilidade /.

Tomas Pruzina
fonte
38
Apenas uma observação para ajudar futuros usuários, pois achei esta resposta útil também. O pôster original provavelmente tinha algo em seu substituto (provavelmente oculto na variável) que continha barras. Depois que a primeira dessas barras foi encontrada, o sed considerou a substituição encerrada e o que veio a seguir como uma opção (como g).
21714 Brian Brian Hawk
4
Bem feito (Basta lembrar de envolver expressões variáveis com "não 'caso contrário você vai ter um monte de $contentem seu resultado final em vez do conteúdo de $content:))
1
@AbstractDissonance Talvez, se você estiver substituindo uma senha ou algo estranho ou aleatório, ainda tenha @. Você deve encontrar um delimitador que não esteja contido na sua sequência de substituição.
Xavi Montero
5
O @ppumkin substitui os delimitadores "barra invertida", como por exemplo: sed -i "s/../../g"com caracteres diferentes, ou seja: : sed -i "s@...@...@g", o problema de várias barras deve desaparecer. E se você usar "em vez de 'que deveria também funciona bem com variáveis dentro, ou seja: export var1=bar; sed -i "s@foo@${var1}@g". Mais informações você pode encontrar na documentação sed incrível: grymoire.com/Unix/Sed.html
Egel
1
Veja info sed(fonte: unix.stackexchange.com/questions/259083/… ): "A sintaxe do comando s (como no substituto) é 's / regexp / replace / flags'. Os caracteres / podem ser substituídos uniformemente por qualquer outro caractere único dentro de qualquer comando s ".
Gabriel Staples