variable - ubicacion linux
Variable de entorno de sustitución en sed (10)
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 intérprete de comandos que necesita detener, y ''citar'' la parte $varname
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 obtener sed para reconocer un $var
como una variable de entorno como se define en el shell?
mala forma: cambiar el delimitador
sed ''s/xxx/''"$PWD"''/''
sed ''s:xxx:''"$PWD"'':''
sed ''s@xxx@''"$PWD"''@''
tal vez esa no sea la respuesta final,
no se puede saber qué carácter ocurrirá en $PWD
, /
:
OR @
.
la buena manera es reemplazar el personaje especial en $PWD
.
buena forma: delimitador de escape
por ejemplo:
uso /
como delimitador
echo ${url////////}
x.com:80//aa//bb//aa.js
echo ${url///////}
x.com:80/aa/bb/aa.js
echo "${url///////}"
x.com:80//aa//bb//aa.js
echo $tmp | sed "s/URL/${url////////}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
echo $tmp | sed "s/URL/${url///////}/"
<a href="x.com:80/aa/bb/aa.js">URL</a>
O
uso :
como delimitador (más legible que /
)
echo ${url//://:}
x.com:80/aa/bb/aa.js
echo "${url//://:}"
x.com/:80/aa/bb/aa.js
echo $tmp | sed "s:URL:${url//://:}:g"
<a href="x.com:80/aa/bb/aa.js">x.com:80/aa/bb/aa.js</a>
Además de la respuesta de Norman Ramsey, me gustaría añadir que puede citar dos veces toda la cadena (lo que puede hacer que la declaración sea más legible y menos propensa a errores).
Por lo tanto, si desea buscar ''foo'' y reemplazarlo con el contenido de $ BAR, puede encerrar el comando sed entre comillas dobles.
sed ''s/foo/$BAR/g''
sed "s/foo/$BAR/g"
En el primero, $ BAR no se expandirá correctamente, mientras que en el segundo $ BAR se expandirá correctamente.
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:
sed ''s/xxx/''$PWD''/''
se expandirá a
sed `s/xxx//home/yourname//
que no es válido Debes poner un carácter /
delante de cada uno /
en tu $ PWD si quieres hacer esto.
En realidad, lo más simple (al menos en gnu sed) es usar un separador diferente para el comando de sustitución sed (s). Entonces, en lugar de s / pattern / ''$ mypath'' / expandido a s / pattern // my / path / que por supuesto confundirá el comando s, use s! Pattern! ''$ Mypath''! que se ampliará a s! pattern! / my / path! He usado el carácter bang (!) (O uso lo que quieras) que evita la barra inclinada usual, pero por ningún medio, tu única opción como el separador.
Otra alternativa fácil:
Como $PWD
generalmente contiene una barra inclinada /
, use |
en lugar de /
para la declaración sed:
sed -e "s|xxx|$PWD|"
Puede usar otros caracteres además de "/" en sustitución:
sed "s#$1#$2#g" -i FILE
Sus dos ejemplos son 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 inclinada, en cuyo caso debe encontrar un carácter no incluido en$PWD
para usar como delimitador.
Para resolver ambos problemas a la vez, quizás
sed ''s@xxx@''"$PWD"''@''
Tuve un problema similar, tenía una lista y tengo que crear un script SQL basado en la plantilla (que contenía @INPUT@
como elemento para reemplazar):
for i in LIST
do
awk "sub(//@INPUT/@/,/"${i}/");" template.sql >> output
done
Tratando con VARIABLES dentro de sed
[root@gislab00207 ldom]# echo domainname: None > /tmp/1.txt
[root@gislab00207 ldom]# cat /tmp/1.txt
domainname: None
[root@gislab00207 ldom]# echo ${DOMAIN_NAME}
dcsw-79-98vm.us.oracle.com
[root@gislab00207 ldom]# cat /tmp/1.txt | sed -e ''s/domainname: None/domainname: ${DOMAIN_NAME}/g''
--- Below is the result -- very funny.
domainname: ${DOMAIN_NAME}
--- You need to single quote your variable like this ...
[root@gislab00207 ldom]# cat /tmp/1.txt | sed -e ''s/domainname: None/domainname: ''${DOMAIN_NAME}''/g''
--- The right result is below
domainname: dcsw-79-98vm.us.oracle.com
VAR=8675309
echo "abcde:jhdfj$jhbsfiy/.hghi$jh:12345:dgve::" |/
sed ''s/:[0-9]*:/:''$VAR'':/1''
donde VAR contiene lo que desea reemplazar el campo con