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 :

Suppression d'une partie de fichier entre deux balises


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Août 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Suppression d'une partie de fichier entre deux balises
    Bonjour, je sais que la question a été maintes fois posées.
    J'ai vu des "tas" de réponses qui ne répondent pas à mon problèmes (où alors j'ai mal regardé et vous prie de m'excuser de ce qui s'apparenterait à un SPAM).
    Merci à ceux qui auront la sympa de me répondre et de faire - je m'en excuse platement - de la "redite".

    Voici j'ai un fichier qui a la "tête" suivante :

    /titi
    bkabkaka
    dkglqglqgl
    dfqkdgqg
    dfqfqfq
    dfffq
    qdfqfd
    /toto

    Je veux supprimer tout ce qui se trouve entre /titi et /toto. Je suis sûr que ce type de problème a déjà été traité au moins une fois par un "maître" unix.

    J'ai tenté avec SED, mais cet outil ne me semble permettre de n'intervenir que si les "choses" se trouvent sur une ligne. Exemple :

    dfghkgh|hfgfgksg|hkdhgskfgkgs => on obtient tout sauf ce qu'il y a entre les deux pipes.

    On peut utiliser SED et supprimer tout ce qui se trouve entre les pipes ("|").

    Alors je cherche une "bonne âme" pour m'aider à créer/utiliser une commande unix qui réponde à mes "désirs".

    Merci d'avance aux "âmes charitables".

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    effectivement c'est un grand classique à force
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/^\/titi/,/^\/toto/d' fichier
    l'option -i sert à effectuer une modification inplace, en clair une fois la commande lancée c'est supprimé dans le fichier, be careful.

    avec awk on peut aussi mais pas inplace, on devra passer par un fichier temporaire explicite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/^\/titi/,/^\/toto/ {next} {print}' fichier > nouveau_fichier
    edit: tiens et puis une version perl en prime, y'a moyen de faire inplace (man perl / perl --help) c'est laissé en exercice au besoin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print if not /^\/titi/../^\/toto/' fichier > nouveau_fichier
    edit 2: j'ai précisé que toutes ces solutions suppriment également /titi et /toto ?

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par BufferBob Voir le message
    avec awk on peut aussi mais pas inplace
    Si si on peut, depuis la version 4.1.0 released (voir "inplace" file editing)
    6. The "inplace" extension, built using the new facility, can be used to
    simulate the GNU "sed -i" feature.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -i inplace '/^\/titi/,/^\/toto/ {next} {print}' fichier

    Citation Envoyé par BufferBob Voir le message
    edit 2: j'ai précisé que toutes ces solutions suppriment également /titi et /toto ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\#^/titi#,\#^/toto# {//b;d}' fich
    Le //b; permet de sauter les motifs cités précédemment.

    $ man woman
    Il n'y a pas de page de manuel pour woman.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    • L'objet minimal est la ligne.
    • Si /titi et /toto sont sur la même ligne, la technique de la plage d'adresses ne fonctionne pas.
    • Si tu as des mots séparés par des pipes de position variable, tu as probablement un fichier organisé en "champs". A ce moment là, awk est peut-être mieux indiqué.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ echo "dfghkgh|hfgfgksg|hkdhgskfgkgs" | awk -F'|' '{OFS="|";$2="";print}'
      dfghkgh||hkdhgskfgkgs


    @BufferBob: Tu peux remplacer par
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par BufferBob Voir le message
    ...mais pas inplace, on devra passer par un fichier temporaire explicite
    Pas forcément. On peut éviter le temporaire explicite en utilisant un canal numéroté (on a le choix de 3 à 63 car il n'y en a "que" 64 et 0, 1 et 2 sont déjà pris) qui servira de temporaire implicite mais c'est du sans filet...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<fichier
    rm -f fichier
    awk '/^\/titi/,/^\/toto/ {next} {print}' 0<&3 >fichier

    Le "exec" crée un canal numéroté prenant en entrée le fichier demandé. A partir de là, tout ce qu'on lira dans le 3 sera pris dans le fichier. Ensuite on efface le fichier. Cette étape est obligatoire pour éviter que la redirection écrase le contenu du fichier mais à partir de là, s'il y a un crash on a tout perdu.
    Ensuite ne reste qu'à lire le canal 3 (toujours actif) et écrire dans le fichier qui devient alors "nouveau" fichier...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    On peut éviter le temporaire explicite en utilisant un canal numéroté
    aka un descripteur de fichier ;p c'est ni plus ni moins qu'un fichier qui réside en mémoire (via bash)
    par défaut y'en a plutôt 256 (ulimit -n)

Discussions similaires

  1. [Débutant] Prendre une chaine de texte entre deux balises d'un code source.
    Par megavigore33 dans le forum VB.NET
    Réponses: 7
    Dernier message: 09/12/2014, 23h05
  2. Remplacer une chaine de caractere entre deux balise
    Par xyrox dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2010, 14h11
  3. Réponses: 1
    Dernier message: 16/10/2010, 17h50
  4. Réponses: 4
    Dernier message: 27/08/2010, 04h57
  5. [RegEx] Vérifier si une chaîne se trouve entre deux balises ?
    Par symbolyk dans le forum Langage
    Réponses: 2
    Dernier message: 03/02/2007, 18h37

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