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\"
Respostas:
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
sed
pode 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: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\1
ainda serão interpretadas de acordo com assed
regras. Usar|
como delimitador também é uma boa opção, pois é semelhante em legibilidade/
.fonte
g
)."
não'
caso contrário você vai ter um monte de$content
em seu resultado final em vez do conteúdo de$content
:))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.htmlinfo 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 ".