sed falla con el error "opción desconocida para 's'"

158

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\"

Señor rey
fuente
8
El mensaje de error * BSD (incluido OSX) es "indicador incorrecto en el comando sustituto": se incluye aquí para que esto sea algo más fácil de buscar.
tripleee

Respuestas:

355

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 sedpuede 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:

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

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 \1se seguirá interpretando de acuerdo con las sedreglas. Usar |como delimitador también es una buena opción, ya que es similar en legibilidad a /.

Tomás Pruzina
fuente
38
Solo una nota para ayudar a los futuros usuarios, ya que esta respuesta también me pareció útil. El póster original probablemente tenía algo en su reemplazo (probablemente oculto en la variable) que contenía barras diagonales. Después de que se encontró la primera de esas barras, sed consideró que el reemplazo terminó, y lo que vino después como una opción (como g).
Brian Warshaw
44
Bien hecho (solo recuerde envolver expresiones variables, de "lo 'contrario obtendrá mucho $contenten su resultado final en lugar del contenido de $content:))
1
@AbstractDissonance Quizás si está reemplazando una contraseña o algo extraño o aleatorio todavía tiene @ en ella. Debe encontrar un delimitador que no esté contenido en su cadena de sustitución.
Xavi Montero
55
@ppumkin simplemente reemplaza los delimitadores de "barra diagonal" como, por ejemplo, sed -i "s/../../g"con un carácter diferente, es decir sed -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.html
Egel
1
Ver info 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 ".
Gabriel Staples