Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2021, à 22:09

philoeil

[ RESOLU] sed substitution avec parametre en echec

Bonjour,

Pouvez-vous m'aider à faire cette commande de substitution avec sed ?

TitreParam="Info1="
TmpVarParam="/home/phil/Documents/JeCodeShell/TrouvDoublons/JournalT6SavTestSauvegarde/20210127.SauvegardeInfo1.txt"
CheminProjet="./P1.txt"

Ma commande en echec :

sed -i "s/^$TitreParam.*/$TitreParam$TmpVarParam/" "$CheminProjet"

Je pensais avoir la solution avec cette commande (mais ça ne marche pas) :

sed -i 's/^'"$TitreParam.*"'/'"$TitreParam$TmpVarParam"'/' "$CheminProjet"

Message d'erreur

sed: -e expression n°1, caractère 20: option inconnue pour « s »
$ cat ./P1.txt
Info1=/home/phil/Documents/JeCodeShell/TrouvDoublons/JournalT6SavTestSauvegarde/20210124.SauvegardeInfo1.txt

Merci

Dernière modification par philoeil (Le 28/01/2021, à 18:30)

Hors ligne

#2 Le 27/01/2021, à 22:20

Zakhar

Re : [ RESOLU] sed substitution avec parametre en echec

sed -i "s|^${TitreParam}.*|$TitreParam$TmpVarParam|" "$CheminProjet"

Car ta deuxième variable contient des '/' qui mettent la grouille.

C'est un "bricolo vite fait" car si maintenant tu as envie de mettre des '|' dans ta deuxième variable, ça va aussi merder...

Dernière modification par Zakhar (Le 27/01/2021, à 22:21)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 27/01/2021, à 22:30

philoeil

Re : [ RESOLU] sed substitution avec parametre en echec

Bonjour et merci Zakhar
J'ai compris le principe il faut que je choisisse un caractère de séparation qui ne se trouvera jamais dans mes chemins de dossier

Je vais essayer ainsi

 sed -i "s@^"$TitreParam.*"@"$TitreParam$TmpVarParam"@" "$CheminProjet"

Hors ligne

#4 Le 27/01/2021, à 23:06

kamaris

Re : [ RESOLU] sed substitution avec parametre en echec

Tu ne devrais pas multiplier les guillemets comme ça, car là ils ne protègent pas tes variables.
Mets en simplement une paire par chaine comme a fait Zakhar au dessus :

 sed -i "s@^$TitreParam.*@$TitreParam$TmpVarParam@" "$CheminProjet"

Hors ligne

#5 Le 28/01/2021, à 11:12

Zakhar

Re : [ RESOLU] sed substitution avec parametre en echec

philoeil a écrit :

J'ai compris le principe il faut que je choisisse un caractère de séparation qui ne se trouvera jamais dans mes chemins de dossier

Exactement !

kamaris a écrit :

Tu ne devrais pas multiplier les guillemets comme ça, car là ils ne protègent pas tes variables.
Mets en simplement une paire par chaine comme a fait Zakhar au dessus :

On peut même rajouter la "bonne pratique" des accolades pour les variables, ainsi :

 sed -i "s@^${TitreParam}.*@${TitreParam}${TmpVarParam}@" "${CheminProjet}"

C'est d'autant plus important quand tu mélanges les variables au sein d'une chaîne de caractère, car ça évite que la suite de la chaîne soit interprété comme le nom de la variable.
Ayant clairement séparé ainsi les variables, tu vois que tu n'as plus besoin des "guillemets intermédiaires" pour faire cette séparation et éviter le mélange nom de variable/chaîne.
Dans la fin de la commande, pour "${CheminProjet}", c'est potentiellement inutile de penser à mettre les accolades, mais reste une bonne pratique. En effet, quid si tu changes d'avis, et si Chemin est juste le nom du répertoire et tu mets un nom de fichier en dur genre : "${CheminProjet}Fichier.txt". Eh bien sans l'accolade, Fichier.txt serait fusionné au nom de ta variable.
Et ça reste plus lisible que d'écrire "$CheminProjet""Fichier.txt" !

Dernière modification par Zakhar (Le 28/01/2021, à 11:15)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#6 Le 28/01/2021, à 14:57

Watael

Re : [ RESOLU] sed substitution avec parametre en echec

les accolades ne sont pas une bonne pratique. (je peux le mettre en majuscule si ce n'est pas assez clair !)
parfois ça frise le ridicule.

--
je ne me déplace jamais sans une béquille : on ne sait jamais, des fois que je me torde la cheville, ça serait bien utile.
n'importe quoi !

Dernière modification par Watael (Le 28/01/2021, à 14:59)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 28/01/2021, à 16:27

bruno

Re : [ RESOLU] sed substitution avec parametre en echec

Watael a écrit :

les accolades ne sont pas une bonne pratique.

C'est particulièrement vrai en ce moment.

#8 Le 28/01/2021, à 18:28

philoeil

Re : [ RESOLU] sed substitution avec parametre en echec

Bonjour,

Merci à tous

Merci à Bruno pour son humour très confinée
Merci à Zakhar pour m'avoir fait une longue réponse
Merci à Kamaris : toujours de bons conseils, c'est noté je vais appliquer
Merci à Watael : (restons cool please)
Je n'ai qu'une pauvre culture amateur en informatique, je suis incapable de comprendre pourquoi

Watael  a écrit :

Les accolades ne sont pas une bonne pratique

je veux bien te croire et pour être après allé chercher quelques infos sur les accolades et la protection des variables je n'ai rien effectivement trouvé en ce sens
Mais quand tu me donnes une info j'aimerai bien un peu de pédagogie qui mettrait un peu en perspective l'intéret du conseil donné

Bonne journée à tous

Dernière modification par philoeil (Le 28/01/2021, à 18:29)

Hors ligne

#9 Le 28/01/2021, à 18:34

Zakhar

Re : [ RESOLU] sed substitution avec parametre en echec

En fait c'est une question de style !

C'est pareil en C, certain ne jurent que par l'alignement à la Kernighan et Ritchie, dont ont une autre façon : plus concise, plus aérée, etc...

Les goût et les couleurs sont dans la nature.

Les accolades sont faites exactement pour éviter qu'une variable "accroche" avec le reste d'une chaîne de caractère.

Quand il n'y a pas ce risque, l'accolade devient facultative... et certain a trouve ennuyeuse à taper et superflue.

Donc mon cas, c'est un "style" que j'aime bien, ça me permet de bien mieux identifier les variables, et surtout quand elles sont noyées dans des chaînes de caractères. Je préfère aussi que toutes mes variables soient présentées de la sorte plutôt que de n'utiliser les {} que quand c'est utile et les omettre ailleurs. J'aime bien l'homogénéité, en ce qui me concerne, ça me facilite la lecture d'un code !

Et donc comme c'est effectivement une question de goûts et de couleurs, le meilleur "style" est celui qui te convient.

Il n'y a aucun langage où il existe une façon unique d'écrire les choses ! tongue

Dernière modification par Zakhar (Le 28/01/2021, à 18:38)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#10 Le 28/01/2021, à 18:44

Watael

Re : [ RESOLU] sed substitution avec parametre en echec

ça me permet de bien mieux identifier les variables,

trouve-toi un éditeur avec coloration syntaxique.

au hasard, plouf plouf, vim \o/

Dernière modification par Watael (Le 28/01/2021, à 18:45)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 28/01/2021, à 18:46

philoeil

Re : [ RESOLU] sed substitution avec parametre en echec

Merci Zakhar
je vais, grace à ta remarque, mieux faire bon usage des accolades quand nécessaires

Hors ligne

#12 Le 28/01/2021, à 19:28

Zakhar

Re : [ RESOLU] sed substitution avec parametre en echec

Watael a écrit :

trouve-toi un éditeur avec coloration syntaxique.

au hasard, plouf plouf, vim \o/

roll

J'utilise nano ou geany, et les deux colorent aussi bien "${VAR}" que "$VAR"

Mais mon cerveau enregistre mieux la première option, ça va plus vite en quelque sorte. Question de câblage peut-être. wink

C'est comme en C, on peut écrire :

if (cond)
    b++;

if (cond) {
    b++;
}

if (cond) { b++; }

if (cond)
{
    b++;
}

C'est absolument tout équivalent avec des inconvénients au premier (risque d'oubli si une deuxième instruction).
Après il faut déterminer un "style" qui nous va bien, et s'y tenir (éviter les mélanges !)

Certains objecteraient, comme l'histoire des accolades, que l'inconvénient de la première formulation est mineur... en tout cas GCC 9 a cru bon de fournir désormais un warning si on fait un truc suspicieux comme ça :

int foo(int cond, int b)
{
  int a = 4;
  if (cond)
    a += 1;
    return a+b;
}
gcc -c test.c -Wall
test.c: In function ‘foo’:
test.c:5:3: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
    5 |   if (cond)
      |   ^~
test.c:7:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
    7 |  return a+b;
      |  ^~~~~~

Autrement dit une "écriture raccourcie" pour "faire concis"... on rajoute un bout de code et on a oublié qu'on avait "fait vite" !..

En shell personne ne vous préviendra, la variable sera juste vide.

C'est vous qui voyez. lol

Dernière modification par Zakhar (Le 28/01/2021, à 19:38)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#13 Le 28/01/2021, à 19:31

kamaris

Re : [ RESOLU] sed substitution avec parametre en echec

if (cond)
  b++;

Définitivement. (Non, je ne trolle pas big_smile)

Hors ligne

#14 Le 28/01/2021, à 19:41

Zakhar

Re : [ RESOLU] sed substitution avec parametre en echec

kamaris a écrit :

Définitivement. (Non, je ne trolle pas big_smile)

Oui, c'est le style "kernel"... mais c'est assorti de conditions !

Je fais comme ça aussi, et je respecte la condition supplémentaire du "style kernel"

La condition supplémentaire c'est que tu n'écris pas (bien que ce soit 100% syntaxiquement correct) :

if (cond)
    a++
else {
    p++;
    a += 2;
}

if (cond) {
    a++
    p++;
}
else
    a += 2;

Le dissymétrie me pique même les yeux. smile

Et comme expliqué plus haut, en plus, merci version 9 de GCC, ce n'est même plus un problème d'oublier l'accolade au rajout d'une instruction dans le 'if' puisque désormais le compilateur te prévient (à supposer bien sûr que tu aies indenté correctement !)

... et le shell lui ne te prévient pas qu'un nom de variable a été concaténé avec un bout de chaîne... Ton shell risque de continuer à fonctionner mais faire "des choses bizarres", voire ouvrir la voie à des failles de sécurité (faciliter l'evil eval au moins !)

Dernière modification par Zakhar (Le 28/01/2021, à 19:51)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne