Comment utiliser les variables d'environnement dans la commande SED

Comment utiliser les variables d'environnement dans la commande SED
Une variable d'environnement est une valeur nommée dynamiquement. Les variables environnementales sont généralement exportées vers un terminal en utilisant la commande ci-dessous.
export $ someVariable = valeur

Les fichiers sont disponibles dans tous les terminaux après source; À cette fin, les variables environnementales sont stockées à l'intérieur des fichiers bash.

Supposons que l'utilisateur doit utiliser ou modifier les variables environnementales à l'aide de la commande SED. Dans ce cas, les utilisateurs ne peuvent pas utiliser la commande comme mentionné ci-dessus pour cela. Différentes fonctions et méthodes doivent être utilisées pour la commande SED. Dans cet article, nous verrons de telles méthodes, qui sont les suivantes.

Dans la ligne de commande Linux, SED est un puissant outil de traitement. En utilisant des doublures compacts SED, les utilisateurs effectuent souvent un remplacement de texte, ce qui est assez pratique. Lorsque les utilisateurs remplacent SED par des variables de shell, il a également des inconvénients.

Comment utiliser les variables d'environnement dans la commande SED

Ayons un exemple, nous avons ici un fichier nommé test.SMS.

test de chat.SMS
Current_time = # Remplissez le
Date et heure actuelles
Java_home = # Remplissez le
Chemin java_home

Nous rédigerons un script shell pour remplir le chemin Java_Home et l'heure actuelle dans le système actuel ci-dessus donné. Ce processus est facile, mais il y a des problèmes qui sont possibles. Ici, nous allons écrire un script en utilisant GNU SED.

Comme nous l'avons mentionné ci-dessus, ici, nous remplacerons le chemin Java_Home et l'heure actuelle. Pour cela, nous allons d'abord remplir l'heure actuelle aux bons endroits ici. Nous pouvons utiliser la commande Date pour obtenir l'heure actuelle.

solution de chat.shot
#!/ bac / sh
My_date = $ (date)
sed -i -r 's / ^ (current_time =).* / \ 1 $ my_date / 'Test.SMS

Le script écrit ci-dessus n'est pas trop difficile à comprendre. En substituant d'abord la commande dans une variable my_date, obtenez l'heure et la date actuelle et enregistrez-la.

Après avoir obtenu les données en utilisant la substitution SED, l'utilisateur les remplit dans le fichier. Nous avons utilisé l'option -i de la commande GNU SED pour effectuer l'édition sur place.

Maintenant, nous allons vérifier et exécuter notre script.

$ ./solution.shot
$ test de chat.SMS
Current_time = $ my_date
Java_home = # Remplissez le chemin Java_Home

Nous voyons dans la sortie que la ligne avec «current_time =» a été remplacée. Cependant, le littéral «$ my_date» est rempli au lieu de l'heure et de la date actuelle.

La raison pour laquelle les variables de coquille ne sont pas étendues dans des devis uniques est que nous avons utilisé des devis uniques sous la commande SED.

Les doubles guillemets sont utilisés dans la commande SED pour permettre une extension de variable de coque à correction rapide.

$ solution de chat.shot
#!/ bac / sh
My_date = $ (date)
sed -i -r "s / ^ (current_time =).* / \ 1 $ my_date / "Test.SMS

Maintenant, nous allons tester la solution.Script à nouveau.

$ ./solution.shot
$ test de chat.SMS
Current_time = mer 27 janvier 10:02:05 PM CET 2021
Java_home = # Remplissez le chemin Java_Home

Après avoir rempli l'heure et la date aux bons endroits, le chemin Java_Home est rempli.

Nous voyons quel délimiteur nous devons utiliser en ajoutant une autre commande SED à notre solution.script.

$ solution de chat.shot

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

Vérification du script ci-dessus.

$ ./solution.shot
SED: -E Expression # 1, char 24: Option inconnue à «s»

Nous voyons que la nouvelle commande SED qui a été ajoutée ne fonctionne pas. Si nous le testons pour la deuxième fois, nous voyons que seule sa variable est différente, mais travailler est la même que la commande SED. Pour résoudre ce problème, nous devons prendre les mesures suivantes:

Le délimiteur n'existe pas dans la variable

Pour bien le savoir, les utilisateurs doivent d'abord comprendre ce que la variable d'environnement $ java_home contient.

$ echo $ java_home
/ usr / lib / jvm / par défaut

Nous pouvons voir que ces variables de coquille sont élargies dans les doubles-quottes. Donc, notre deuxième commande SED vient après l'expansion variable.

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

Les barres obliques (/) dans la valeur de la variable interfèrent avec la commande «s» (s / motif / remplacement /), c'est pourquoi la commande SED ci-dessus ne fonctionne pas. De cette façon, nous pouvons sélectionner d'autres caractères comme délimiteurs de la commande «S».

Les utilisateurs peuvent légèrement modifier la deuxième commande SED pour résoudre ce problème en utilisant '#' comme délimiteur de la commande s.

sed -i -r "s # ^ (java_home =).* # \ 1 $ java_home # "Test.SMS

Maintenant, nous testons le script ci-dessus.

$ ./solution.shot
$ test de chat.SMS
Current_time = mer 27 janvier 10:36:57 PM CET 2021
Java_home = / usr / lib / jvm / par défaut

Solution 2

solution.Sh fonctionne dans la plupart des cas. De plus, nous voyons que '#' dans les noms de fichiers est un caractère valide sur la plupart des * systèmes de fichiers Nix. Si nous exécutons notre script sur java_home sur un système défini sur / opt / # jvm #, le script de l'utilisateur échoue à nouveau. Nous ferons le travail suivant pour que notre script fonctionne dans tous les cas

  1. Si l'utilisateur prend «#» en tant que délimiteur pour une meilleure lisibilité, il doit sélectionner un délimiteur pour la commande SED.
  2. Nous devons échapper à tous les caractères de délimiteur qui sont dans le contenu de la variable.
  3. Enfin, collectez le matériel restant dans la commande SED.

Les utilisateurs peuvent utiliser la substitution de bash pour échapper au délimiteur. Par exemple, l'utilisateur peut échapper à tous les caractères '#' en variable $ var.

$ Var = "foo # bar # blah"
$ echo "$ var // # / \\ #"
foo \ #bar \ #blah

Maintenant, nous appliquerons notre script ici.

$ solution de chat.shot
#!/ bac / sh
My_date = $ (date)
sed -i -r "s / ^ (current_time =).* / \ 1 $ my_date / "Test.SMS
sed -i -r "s # ^ (java_home =).* # \ 1 $ java_home // # / \\ # # "Test.SMS

Nous allons tester en exécutant notre script avec la variable Java_Home parasite pour voir si cela fonctionne comme prévu.

$ Java_home = / opt / # /: / @ / - / _ / $ / jvm ./solution.shot
$ test de chat.SMS
Current_time = jeu 28 janvier 11:23:07 AM CET 2021
Java_home = / opt / # /: / @ / - / _ / $ / jvm

Nous concluons que notre script fonctionne même si nous avons de nombreux caractères spéciaux dans notre variable Java_Home.

Conclusion

Dans cet article, nous avons vu comment utiliser les variables environnementales avec la commande SED. Ils font également de nombreuses erreurs qu'ils causent, que nous avons également mentionnées dans cet article et leur réparation. Nous espérons qu'à partir de cet article, vous obtiendrez les connaissances complètes dont vous avez besoin.