Cómo usar las variables de entorno en el comando SED

Cómo usar las variables de entorno en el comando SED
Una variable de entorno es un valor de nombre dinámicamente. Las variables ambientales generalmente se exportan a un terminal utilizando el comando que se muestra a continuación.
exportar $ someVariable = valor

Los archivos están disponibles en todos los terminales después de la fuente; Para este propósito, las variables ambientales se almacenan dentro de los archivos bash.

Suponga que el usuario debe usar o cambiar las variables ambientales con la ayuda del comando SED. En ese caso, los usuarios no pueden usar el comando como se mencionó anteriormente para este. Se deben utilizar diferentes funciones y métodos para el comando SED. En este artículo, veremos algunos de estos métodos, que son los siguientes.

En la línea de comandos de Linux, SED es una potente herramienta de procesamiento. Utilizando las frases SED compactas, los usuarios a menudo realizan un reemplazo de texto que es bastante conveniente. Cuando los usuarios reemplazan a SED con variables de shell, también tiene algunas desventajas.

Cómo usar las variables de entorno en el comando SED

Tengamos un ejemplo, aquí tenemos un archivo llamado prueba.TXT.

prueba de gato.TXT
Current_time = # llenar el
Fecha y hora actuales
Java_home = # llenar el
Ruta java_home

Escribiremos un script de shell para poblar la ruta Java_Home y la hora actual en el sistema actual dado. Este proceso es fácil, pero hay algunos problemas que son posibles. Aquí escribiremos un script usando gnu sed.

Como hemos mencionado anteriormente, aquí, sustituiremos la ruta java_home y la hora actual. Para esto, primero llenaremos la hora actual en los lugares correctos aquí. Podemos usar el comando de fecha para obtener la hora actual.

solución de gato.mierda
#!/bin/sh
My_date = $ (fecha)
sed -i -r 's/^(current_time =).*/\ 1 $ my_date/'prueba.TXT

El script escrito anteriormente no es demasiado difícil de entender. Al sustituir primero el comando en una variable my_date, obtenga el tiempo y la fecha actual y guárdelo.

Después de obtener los datos utilizando la sustitución de SED, el usuario los llena en el archivo. Hemos utilizado la opción -i del comando gnu sed para realizar la edición en el lugar.

Ahora verificaremos y ejecutaremos nuestro script.

ps ./solución.mierda
Prueba de $ Cat.TXT
Current_time = $ my_date
Java_home = # llena la ruta java_home

Vemos en la salida que la línea con "curtent_time =" ha sido reemplazada. Sin embargo, el literal "$ my_date" se completa en lugar de la hora y la fecha actual.

La razón por la cual las variables de shell no se amplían dentro de cotizaciones individuales es que utilizamos citas individuales bajo el comando SED.

Se utilizan cotizaciones dobles en el comando SED para permitir la expansión de la variable de shell de fijación rápida.

Solución de $ CAT.mierda
#!/bin/sh
My_date = $ (fecha)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"prueba.TXT

Ahora probaremos la solución.SH Script de nuevo.

ps ./solución.mierda
Prueba de $ Cat.TXT
Current_time = miércoles 27 de enero 10:02:05 PM CET 2021
Java_home = # llena la ruta java_home

Después de llenar la hora y la fecha en los lugares correctos, se llena la ruta Java_Home.

Vemos qué delimitador debemos usar agregando otro comando SED a nuestra solución.SHIR SCRIPTO.

Solución de $ CAT.mierda

sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"prueba.TXT
sed -i -r "s/^(java_home =).*/\ 1 $ java_home/"prueba.TXT

Verificar el script anterior.

ps ./solución.mierda
SED: -E Expresión #1, Char 24: Opción desconocida para 's'

Vemos que el nuevo comando SED que se ha agregado no está funcionando. Si lo probamos por segunda vez, vemos que solo su variable es diferente, pero trabajar es lo mismo que el comando SED. Para resolver esto, debemos tomar las siguientes medidas:

El delimitador no existe en la variable

Para saber esto bien, los usuarios primero deben comprender qué contiene la variable de entorno $ java_home.

$ echo $ java_home
/usr/lib/jvm/predeterminado

Podemos ver que esas variables de carcasa se expanden dentro de las quotas dobles. Entonces nuestro segundo comando SED viene después de la expansión variable.

sed -i -r "s/^(java_home =).*/\ 1/usr/lib/jvm/default/"prueba.TXT

Las barras (/) en el valor de la variable interfieren con el comando 's' (s/patrón/reemplazo/), por lo que el comando SED anterior no funciona. De esta manera, podemos seleccionar otros caracteres como delimitadores del comando 's'.

Los usuarios pueden modificar ligeramente el segundo comando SED para resolver esto usando '#' como delimitador del comando s.

sed -i -r "S#^(java_home =).*#\ 1 $ java_home#".TXT

Ahora probamos el script anterior.

ps ./solución.mierda
Prueba de $ Cat.TXT
Current_time = miércoles 27 de enero 10:36:57 PM CET 2021
Java_home =/usr/lib/jvm/predeterminado

Solución 2

solución.SH trabaja en la mayoría de los casos. Además, vemos que '#' en los nombres de archivo es un carácter válido en la mayoría de los sistemas de archivos *NIX. Si ejecutamos nuestro script a java_home en un sistema establecido en /opt /#jvm#, el script del usuario falla nuevamente. Haremos el siguiente trabajo para que nuestro script funcione en todos los casos

  1. Si el usuario toma '#' como delimitador para una mejor legibilidad, debe seleccionar un delimitador para el comando SED.
  2. Tenemos que escapar de todos los caracteres delimitadores que están en el contenido de la variable.
  3. Por último, recolecte el material restante en el comando SED.

Los usuarios pueden usar sustitución de bash para escapar del delimitador. Por ejemplo, el usuario puede escapar de todos los caracteres '#' en variable $ var.

$ Var = "foo#bar#bla"
$ echo "$ var //#/\\#"
foo \ #bar \ #BLAH

Ahora aplicaremos nuestro guión aquí.

Solución de $ CAT.mierda
#!/bin/sh
My_date = $ (fecha)
sed -i -r "s/^(current_time =).*/\ 1 $ my_date/"prueba.TXT
sed -i -r "S#^(java_home =).*#\ 1 $ java_home //#/\\##"Prueba.TXT

Probaremos ejecutando nuestro script con la espuria variable java_home para ver si funciona como se esperaba.

$ Java_home =/opt/#/:/@/-/_/$/jvm ./solución.mierda
Prueba de $ Cat.TXT
Current_time = jer 28 de enero 11:23:07 AM CET 2021
Java_home =/opt/#/:/@/-/_/$/jvm

Concluimos que nuestro script funciona a pesar de que tenemos muchos personajes especiales en nuestra variable Java_Home.

Conclusión

En este artículo, vimos cómo usar variables ambientales con el comando SED. También cometen muchos errores que causan, que también hemos mencionado en este artículo y su reparación. Esperamos que en este artículo obtenga el conocimiento completo que necesita.