Estoy tratando de usar
sed -i -e "s/.*seb.*/ \"$ftp_login_template\"/" $ftp_dir
Sin embargo me sale este error:
sed: -e expression #1, char 34: unknown option to `s'
No entiendo por qué, ya que esto funciona perfectamente:
sed -i -e "s/.*wbspassword.*/ \"wbspassword\": \"$password\",/" $user_conf
¿Alguna idea de lo que estoy haciendo mal?
¿Podría ser este el problema?
ftp_login_template=\${user}:${password}:24:86::\/var\/lib\/clit.${user}\/downloads:\/bin\/false\"
Respuestas:
El problema está en las barras inclinadas: su variable las contiene y el comando final será algo así
sed "s/string/path/to/something/g"
, que contiene demasiadas barras inclinadas.Como
sed
puede tomar cualquier carácter como delimitador (sin tener que declarar el nuevo delimitador), puede intentar usar otro que no aparezca en su cadena de reemplazo:Tenga en cuenta que esto no es a prueba de balas: si la cadena de reemplazo que contiene más
@
adelante se romperá por la misma razón, y cualquier secuencia de barra invertida como\1
se seguirá interpretando de acuerdo con lassed
reglas. Usar|
como delimitador también es una buena opción, ya que es similar en legibilidad a/
.fuente
g
)."
lo'
contrario obtendrá mucho$content
en su resultado final en lugar del contenido de$content
:))sed -i "s/../../g"
con un carácter diferente, es decirsed -i "s@...@...@g"
, entonces, el problema de las barras múltiples debería desaparecer. Y si se utiliza"
en lugar de'
lo que debería también funciona bien con las variables en el interior, es decir:export var1=bar; sed -i "s@foo@${var1}@g"
. Puede encontrar más información en la impresionante documentación de sed: grymoire.com/Unix/Sed.htmlinfo sed
(fuente: unix.stackexchange.com/questions/259083/… ): "La sintaxis del comando s (como sustituto) es 's / regexp / replace / flags'. Los caracteres / pueden ser reemplazados uniformemente por cualquier otro carácter único dentro de cualquier comando de s ".