2011-10-04 28 views
12

Soy nuevo en shell scripting pero obtengo este error y no puedo entender qué sucede.Obteniendo error de sed

sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 

Aquí es el guión que estoy corriendo

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    sed -i "s/HOSTNAME/${IP_ADDRESS}/g" $fl 
done 

Gracias

Respuesta

43

Dado que sed parece pensar que se está ejecutando un comando delete line (d), es posible que desee dar salida a la comando para ver qué es realmente en esa variable de entorno suya:

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    echo sed -i "s/HOSTNAME/${PSM_SERVER_ADDRESS}/g" $fl 
done 

Hay una gran probabilidad de que PSM_SERVER_ADDRESS esté dañando su comando sed (y es posible que deba procesarse para que quede limpio). Una forma de hacer esto (siempre que tenga una reciente suficiente sed) sería utilizar delimitadores que no aparecen en la variable de entorno, por ejemplo:

sed -i "s?HOSTNAME?${PSM_SERVER_ADDRESS}?g" $fl 

Puesto que usted ha aceptado esta respuesta, también puede agregar la resolución para el problema adicional que encontró. Parece que BSD sed, a diferencia de Linux, tiene un requisito que proporciona una extensión a la opción -i. Así, mientras que Linux permite:

sed -i "sed-command" 

a editar en el lugar, la variante BSD necesita tener:

sed -i "" "sed-command" 

con un sufijo de respaldo vacía.

Sin eso, sed puede usar su comando como la extensión y su primer nombre de archivo como el comando.

+2

Lo es. El valor 'PSM_SERVER_ADDRESS' es una ruta (que contiene'/'caracteres) por lo que el comando s interpreta esos'/'caracteres como sus delimitadores (por ejemplo,' s/HOSTNAME // Users/davidkavanagh/path/g'. Parece alternativo se deben usar delimitadores. Tal vez 's @ HOSTNAME @ $ {PSM_SERVER_ADDRESS}/g'. – jamessan

+0

IP_ADDRESS es igual a una función que obtiene ip usando el nombre de host -i para usar en todas las plataformas – daverocks

+0

@daverocks, aún necesita ejecutar el script modificado Proporcioné para hacer eco en la línea, incluso con los cambios que ha realizado. Es la única forma de saber cuáles son los comandos que se le dan a 'sed'. – paxdiablo

Cuestiones relacionadas