Si ejecuto estos comandos desde un script:
#my.sh
PWD=bla
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
xxx
bla
está bien.
Pero si corro:
#my.sh
sed 's/xxx/'$PWD'/'
...
$ ./my.sh
$ sed: -e expression #1, char 8: Unknown option to `s'
Leí en los tutoriales que para sustituir las variables de entorno del shell, debe detenerse y 'citar' la $varname
parte para que no se sustituya directamente, que es lo que hice, y que funciona solo si la variable se define inmediatamente antes.
¿Cómo puedo hacer que sed reconozca a $var
como una variable de entorno tal como se define en el shell?
set -x
en el shell para que el shell haga eco de cada comando justo antes de que los ejecute. Esto puede aclarar mucha confusión. (Además, a menudo usoset -u
para hacer que la desreferenciación de las variables no definidas sea un error difícil. (Verset -e
también.))Respuestas:
Sus dos ejemplos parecen idénticos, lo que hace que los problemas sean difíciles de diagnosticar. Problemas potenciales:
Es posible que necesite comillas dobles, como en
sed 's/xxx/'"$PWD"'/'
$PWD
puede contener una barra oblicua, en cuyo caso debe buscar un carácter que no esté en$PWD
para usarlo como delimitador.Para resolver ambos problemas a la vez, tal vez
fuente
Además de la respuesta de Norman Ramsey, me gustaría agregar que puede comillas dobles la cadena completa (lo que puede hacer que la declaración sea más legible y menos propensa a errores).
Entonces, si desea buscar 'foo' y reemplazarlo con el contenido de $ BAR, puede encerrar el comando sed entre comillas dobles.
En el primero, $ BAR no se expandirá correctamente, mientras que en el segundo $ BAR se expandirá correctamente.
fuente
"2,$s/^/$foo/"
también$s
se interpreta como una variable y no debería.Puede usar otros caracteres además de "/" en sustitución:
fuente
sed
era un fastidio debido a la interpretación/
de los contenidos de $ 2. Esto era exactamente lo que necesitaba para superarlo. Gracias por un gran consejo!Otra alternativa fácil:
Como
$PWD
generalmente contendrá una barra oblicua/
, use en|
lugar de/
para la declaración sed:fuente
$PWD
...Con la edición de su pregunta, veo su problema. Digamos que el directorio actual es
/home/yourname
... en este caso, su comando a continuación:se ampliará a
Que no es válido. Necesitas poner un
\
personaje delante de cada uno/
en tu $ PWD si quieres hacer esto.fuente
mal camino: cambiar delimitador
tal vez esa no sea la respuesta final,
no puede saber en qué personaje se producirá
$PWD
,/
:
OR@
.La buena manera es reemplazar el carácter especial en
$PWD
.buena manera: delimitador de escape
por ejemplo: intente reemplazar
URL
como $ url (tiene:
/
contenido)en cadena $ tmp
a. utilizar
/
como delimitadorO
si. utilizar
:
como delimitador (más legible que/
)fuente
En realidad, lo más simple (al menos en gnu sed) es usar un separador diferente para el comando de sustitución (es) de sed. Entonces, en lugar de que s / pattern / '$ mypath' / se expanda a s / pattern // my / path / que, por supuesto, confundirá el comando s, ¡use s! Pattern! '$ Mypath'! que se expandirá a s! pattern! / my / path! He usado el carácter de explosión (!) (O uso cualquier cosa que desee) que evita la barra diagonal habitual, pero de ninguna manera su única opción como separador.
fuente
donde VAR contiene lo que desea reemplazar el campo con
fuente
Manejo de VARIABLES dentro de sed
fuente
Tuve un problema similar, tenía una lista y tengo que construir un script SQL basado en una plantilla (que contenía
@INPUT@
como elemento para reemplazar):fuente