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 :

[BASH] sed, remplacer un pattern correspondant à tout sauf


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 36
    Par défaut [BASH] sed, remplacer un pattern correspondant à tout sauf
    Bonjour,

    je cherche à faire une modification d'un fichier texte, via un script bash.

    j'ai un certain nombre de fichiers avec plusieurs lignes et je cherche à remplacer \n par un espace sur toutes les lignes qui se terminent par "(un caractère)\n" mais pas par "]\n"

    Sur notepad++ j'utilise le regex "([^\]])\n" remplacé par "$1 ", pas de souci ça marche bien, mais sur ma debian impossible de le transposer, le résultat est inversé, ou est mon erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/bin/bash
    # For all row in all text file in current dir, (try to) replace \n by space when previous character is not ]
    for f in *.txt; do
        sed -i -E ':label1;N;$!blabel1;s/([^\]])\n/\1 /g' "$f"
    done
    (Sauf erreur de ma part :label1;N;$!blabel1; permet d'avoir 2 lignes en même temps sauf si c'est la dernière donc d'avoir les \n, a priori cette partie marche)

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Déjà, sed sait traiter plusieurs fichiers, donc l boucle for n'est pas très utile ici.

    Sinon exemple via gnu sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo -e "ligne abzd\nligne fini]\nligne apres\ntutu"
    ligne abzd
    ligne fini]
    ligne apres
    tutu
    $ echo -e "ligne abzd\nligne fini]\nligne apres\ntutu" | sed -z 's/\([^]]\)\n/\1 /g'
    ligne abzd ligne fini]
    ligne apres tutu

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -zr 's/([^]])\n/\1 /g;$s/$/\n/'

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 36
    Par défaut
    Super, merci ça marche.

    Si je comprend bien l'option -z permet de changer le délimiteur de ligne en autre chose que \n (\0 ?) et donc de travailler sur plusieurs lignes,
    et tu fait \( \) pour que le \1 marche derrière, je pensais que c’était l’inverse.

    Si je ne mets pas de boucle, tous les fichiers du dossier seront traités, pdf, .nimportequoi... ça peu faire des trucs blizzard si je n'ai pas que des txt dans mon dossier non ?

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    oui pour le -z.

    je ne vois pas pourquoi for serait capable de traiter '*.txt' correctement et pas sed

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Citation Envoyé par ca--rd Voir le message
    Si je comprend bien l'option -z permet de changer le délimiteur de ligne
    Pas vraiment. Il charge tout le fichier dans l'espace de travail. Les \n restent.

    Citation Envoyé par ca--rd Voir le message
    Si je ne mets pas de boucle, tous les fichiers du dossier seront traités, pdf, .nimportequoi... ça peu faire des trucs blizzard si je n'ai pas que des txt dans mon dossier non ?
    Personne ne dit que tu dois faire sed 'blablabla' * mais sed 'blablabla' *.txt.

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

Discussions similaires

  1. sed remplacer chaînes de caractères sauf plusieurs chaînes identifiées
    Par yoyostras dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 20/10/2017, 19h47
  2. Réponses: 4
    Dernier message: 06/07/2014, 19h46
  3. SELECT "tout sauf champs xx, yy..."
    Par _marabout dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/01/2008, 17h42
  4. Réponses: 2
    Dernier message: 29/08/2007, 12h52
  5. [RegEx] Tout sauf un mot dans une REGEX?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2006, 11h12

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