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 :

[sed] Remplacer une ligne qui a un début et une fin précise : impossible


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    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
    Points : 91
    Points
    91
    Par défaut [sed] Remplacer une ligne qui a un début et une fin précise : impossible
    Bonsoir,

    Via un script, je cherche à remplacer une ligne de commentaire dans un fichier ssh_config :
    Malheureusement entre le # et la chaine, il y a des espaces et en fonction du fichier le nombre d'espace peut varier.
    Du coup, j'essaie d'identifier la ligne commençant par # et finissant par port 22, pour la remplacer par :
    Pour cela j'utilise la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/#.*\port 22/port 23/p' ssh_config
    mais elle ne marche pas

    Pourriez-vous m'aider svp ?
    D'avance merci si possible ;-)

  2. #2
    Membre régulier
    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
    Points : 91
    Points
    91
    Par défaut
    Bon erreur bête, c'était pas port mais Port.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/#.*\Port 24/Port 25/' ssh_config
    Par contre j'ai été obligé d'enlever le p car ca écrivait 2 fois Port 25

    D'ailleurs je ne comprends pas bien pourquoi ?

    Sinon, ca marche...

  3. #3
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par BEEP-BEEP Voir le message
    Par contre j'ai été obligé d'enlever le p car ca écrivait 2 fois Port 25
    sed écrit toutes les lignes de son entrée en sortie par défaut (après modifications) : pour inverser ce comportement, il faut utiliser l'option -n.

    Sinon l'antislash est inutile devant le P, et tu pourrais être plus précis pour éviter les faux positifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/^#\s*Port 24$/Port 25/' ssh_config

  4. #4
    Membre régulier
    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
    Points : 91
    Points
    91
    Par défaut
    sed écrit toutes les lignes de son entrée en sortie par défaut (après modifications) : pour inverser ce comportement, il faut utiliser l'option -n.
    Oui, la sortie par défaut étant la sortie standard écran. -n inverse le comportement ? c'est à dire n'écrit nul part ?

    -i l'oblige à écrire non pas sur la sortie standard écran, mais dans le fichier spécifié.

    Sinon l'antislash est inutile devant le P
    Devant le P de Port ?

    Qu'est ce qu'un faux positif ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/^#\s*Port 24$/Port 25/' ssh_config
    s : suppression ?
    ^#\s* : ????????
    24$ : ??????????????

    Sinon, depuis j'ai trouvé une autre manière de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "/Port 24/c Port 25" ssh_config

  5. #5
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Oui, la sortie par défaut étant la sortie standard écran. -n inverse le comportement ? c'est à dire n'écrit nul part ?
    Voilà : c'est à toi de gérer l'écriture par la commande p (indépendamment de là où écrit sed, c'est un autre problème).

    Devant le P de Port ?
    Oui.

    Qu'est ce qu'un faux positif ?
    Une ligne qui correspond au motif recherché, alors qu'elle ne devrait pas (du point de vue de ce que veut l'utilisateur).
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '# blabla Port 24 blibli' | sed 's/#.*\Port 24/Port 25/'
    Port 25 blibli
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '# blabla Port 24 blibli' | sed 's/^#\s*\Port 24$/Port 25/'
    # blabla Port 24 blibli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/^#\s*Port 24$/Port 25/' ssh_config
    s : suppression ?
    ^#\s* : ????????
    24$ : ??????????????
    s : commande de substitution (que tu utilises déjà dans ton propre code !) ;
    ^# : la ligne commence par # ;
    \s* : 0 ou plus caractères d'espacement (espace, tabulation, etc.) ;
    24$ : la ligne se termine par 24.

    Sinon, depuis j'ai trouvé une autre manière de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "/Port 24/c Port 25" ssh_config
    La commande c est effectivement adaptée, mais là encore, ça manque de précision au niveau du motif recherché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "/^#\s*Port 24$/c Port 25" ssh_config
    Pour plus d'infos concernant sed, la référence est info sed, ou bien en ligne : https://www.gnu.org/software/sed/manual/sed.html.
    Bonne lecture !

  6. #6
    Membre régulier
    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
    Points : 91
    Points
    91
    Par défaut
    Merci ;-)

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

Discussions similaires

  1. [sed] Remplacer une chaine qui précède une autre chaine
    Par noooop dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 25/03/2014, 09h31
  2. [Sed] Remplacer une chaîne d'une ligne donnée
    Par Johan_A dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 27/06/2012, 11h02
  3. [Sed]Remplacer une série d'espaces par un délimiteur
    Par progfou dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/01/2011, 15h09
  4. sed: remplacer une ligne qui commence par Version
    Par lili2704 dans le forum Linux
    Réponses: 8
    Dernier message: 21/07/2008, 14h26
  5. Réponses: 2
    Dernier message: 29/08/2007, 12h52

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