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 :

numéro de lignes variable avec sed


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Par défaut numéro de lignes variable avec sed
    Bonjour,

    j'ai besoin de supprimer toutes les lignes plus une jusqu'à un certain motif ("--------------") dans un fichier ($1). Le motif est répété plusieurs fois, il faut supprimer les lignes jusqu'au dernier motif (plus une ligne après). J'arrive à récupérer le numéro de ligne du dernier motif (toujours sur 2 caractères) ; si vous avez plus simple que ce que j'ai fait, je suis preneur. Avec sed je sais supprimer les lignes mais je n'arrive pas à passer le numéro de ligne en paramètre. Mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grep -n '\--------------' $1 > tmpLignes.txt
    DERLIGNE=$(sed '$!d' tmpLignes.txt)
    NUMLIGNE=$(($(echo $DERLIGNE | cut -c0-2) + 1))
    sed -i '1,${NUMLIGNE}d' $1
    Dans Notepad++, ${NUMLIGNE} est en gris comme une chaine de caractère alors que les variables sont colorées.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 138
    Par défaut
    Citation Envoyé par Christophe P. Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1,${NUMLIGNE}d' $1
    Dans Notepad++, ${NUMLIGNE} est en gris comme une chaine de caractère alors que les variables sont colorées.
    C'est normal : entre guillemets simples (') les chaines de caractères sont protégées et les variables ne sont pas interprétées.
    Il faut mettre cette chaine de commandes entre guillemets doubles (").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "1,${NUMLIGNE}d" $1
    Ensuite, pour supprimer jusqu'à la ligne cherchée tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i "1,/\----------/d" $1
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 389
    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 389
    Par défaut
    Le plus simple est d'utiliser ed, voici un exemple:
    Le fichier que l'on veut traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cat xa
    a
    b
    c
    ---------
    d
    e
    f
    g
    ---------
    supp
    h
    i
    j
    k
    ici, on va supprimer de la ligne 1 au dernier motif '--------' + 1 (donc jusqu'à supp inclus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ ed xa <<EOF
    $
    ?--------
    1,.d
    d
    w
    EOF
    et si on regarde le contenu de xa:
    Explication:
    $ <== aller à la dernière ligne du fichier
    ?------- <== faire une recherche arrière de '-------' ce qui permet d'être sur la dernière occurence.
    1,.d <== supprimer de la ligne 1 à la ligne courante
    d <== pour la suppression de la ligne courante
    w <== sauver fichier

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Par défaut
    Merci à vous deux. Vos solutions fonctionnent bien.
    Je vais utiliser la plus "simple" de disedorgue, tellement "simple" que je vais mettre l'explication en commentaire.

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

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

    Je réponds du tac au tac:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ tac xa|sed '/--------/q'|tac|sed '1,2d'
    h
    i
    j
    k
    Mais si on peut se passer de sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk '{a[NR]=$0;} /--------/{debut=NR+2;} END{for (i=debut;i<=NR;i++) print a[i]}' xa                                                                                                                
    h
    i
    j
    k
    Ou sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ tail -n $(awk '/--------/{debut=NR+1;} END{print NR-debut;}' xa) xa
    h
    i
    j
    k
    Ou encore en utilisant le "=" de sed. Mais je n'ai pas d'idée élégante pour l'exploiter.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 389
    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 389
    Par défaut
    Une version sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 'H;${x;s/^.*------\n[^\n]*\n*//p;}' file

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

Discussions similaires

  1. Remplacer une ligne complète avec SED
    Par cdjkhdjlhxjklnjskznj dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/04/2015, 14h35
  2. [XL-2007] retour des numéros des lignes visibles avec filtre
    Par FanClub51 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/09/2010, 18h00
  3. colonnes fixes et lignes variables avec boucle
    Par tkwleboss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/05/2009, 17h04
  4. Numéro de ligne variable
    Par zit_zit dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/09/2008, 20h02
  5. Réponses: 1
    Dernier message: 03/03/2006, 14h53

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