IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modifier un chemin dans un fichier avec sed : impossible


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut Modifier un chemin dans un fichier avec sed : impossible
    Bonjour,
    Voilà, je cherche à décommenter un chemin dans le fichier .bashrc à l'aide de la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/#if [ -f ~/.bash_aliases ]; then/if [ -f ~/.bash_aliases ]; then/g' ../home/toto/.bashrc
    Le problème vient du fait que dans le chemin, il y a un / mais la commande utilise aussi des / donc ca coince.

    J'ai essayé d'utiliser des \ sans succès et je continue à chercher sur le net...

    Pouvez-vous m'aider svp ?

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Utilise un autre caractère que le '/' pour la commande, par exemple s/foo/bar/ peut aussi s'écrire s@foo@bar@ ou tout autre caractère non présent, il faut juste l'utiliser dans l'entièreté de la commande

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Utilise un autre caractère que le '/' pour la commande, par exemple s/foo/bar/ peut aussi s'écrire s@foo@bar@ ou tout autre caractère non présent, il faut juste l'utiliser dans l'entièreté de la commande
    @Disedorgue Qu'est ce qu'un caractère non présent ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Citation Envoyé par BEEP-BEEP Voir le message
    @Disedorgue Qu'est ce qu'un caractère non présent ?
    Pour tester, j'ai utilisé le % et non pas le @. Ca a marché, mais dans le cas ci-dessous, j'ai dû rajouter un échappement devant le premier [ seulement et ca a marché :

    sed -i 's%#if \[ -f ~/.bash_aliases ]; then%if [ -f ~/.bash_aliases ]; then%g' /home/francis/.bashrc

    Bizarre, [ est-il un caractère particulier ?
    Pourquoi les autres [ et ] n'ont pas besoin d'échappement ici ?

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Ce que j'appelle un caractère non présent, c'est un caractère que tu n'auras pas explicitement dans la partie search et dans la partie replace.
    Après, la partie search est se que l'on appelle une expression régulière dont les caractères suivants sont spéciaux et qu'il faut echappé: .*[]?

    Et pour compliquer les choses, tu as d'autres caractères tel que +(){} qui deviennent spéciaux si tu les échappes.

    Tu peux voir tout ça via la commande info sed qui est un peu plus complet que le man.

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    Merci pour les infos ;-)

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par BEEP-BEEP Voir le message
    Pour tester, j'ai utilisé le % et non pas le @. Ca a marché, mais dans le cas ci-dessous, j'ai dû rajouter un échappement devant le premier [ seulement et ca a marché :

    sed -i 's%#if \[ -f ~/.bash_aliases ]; then%if [ -f ~/.bash_aliases ]; then%g' /home/francis/.bashrc

    Bizarre, [ est-il un caractère particulier ?
    Pourquoi les autres [ et ] n'ont pas besoin d'échappement ici ?
    Il y a d'autres caractères particuliers dans "sed", comme '.*^$', etc.
    Je t'invite à essayer d'ajouter une ligne #if [ -f ~/_bash_aliases ]; then et tu verras qu'elle également reconnue et transformée par ton "sed"!
    (bon, d'accord, faut vraiment le faire exprès! (c'est ça la difficulté de la sécurité "absolue))

    Dans "emacs", il existe une fonction "regexp-quote" qui met des '\' partout où il faut pour transformer une regexp en la même chaîne mais littérale.

    Je ne sais pas s'il y a l'équivalent dans les outils linux...
    à part utiliser "sed" pour quoter les caractères spéciaux (sans en oublier, et avec le bon nombre de '\’ !) ou mettre chaque caractère entre crochets chaine_lit=$(echo "$chaine" | sed -e 's/\(.\)/[\1]/g') sous réserve que ça marche...

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Peut-être le printf du bash avec certaines limite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ printf "%q\n" 'toto[}'
    toto\[\}
    $ printf "%q\n" 'toto[}('
    toto\[\}\(
    $ printf "%q\n" 'toto[}(\\'
    toto\[\}\(\\\\

  9. #9
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    à part utiliser "sed" pour quoter les caractères spéciaux (sans en oublier, et avec le bon nombre de '\’ !)
    Je pense que ça c'est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    regexp_protection() {
      test "$1" = '-E' && set "$(sed 's%[?+{}|()]%\\\&%g' <<<"$2")"
      sed 's%[][$^.\&*]%\\&%g' <<<"$1"
    }
    Je l'utilise depuis un moment dans un script qui va chercher ses motifs sed dans des fichiers où se trouve à peu près n'importe quoi…
    Mais c'est vrai qu'une option -F comme celle de grep ce serait bien.

  10. #10
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2020
    Messages : 175
    Par défaut
    J'ai trouver la solution : il faut utiliser les caractères d'échappement :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer et décommenter une ligne dans un fichier avec sed
    Par nishto dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 06/05/2019, 15h40
  2. Remplacer certaines virgules dans un fichier (avec sed ?)
    Par Christophe P. dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 26/01/2018, 11h26
  3. Rechercher plusieurs mots dans un fichier avec sed
    Par DevServlet dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/01/2012, 14h40
  4. Réponses: 5
    Dernier message: 12/03/2010, 11h03
  5. copie contenu d'un fichier dans un autre fichier avec sed
    Par zorooo dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 18/01/2010, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo