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] Enlever des lignes


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut [sed] Enlever des lignes
    Bonjour,

    je voudrais enlever plusieurs ligne d'un fichier mais il me dit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 65: expression régulière d'adresse inachevée
    voici la partie du script qui enlève des lignes du fichier $nom, lues dans "fichier"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tmp="$(zenity --file-selection --multiple --filename /media/$USER/WALKMAN/MUSIC/)"
    echo $tmp>fichier
    tr "|" "\n" <fichier>fichier2
    cut -d/ -f 6- fichier2 > fichier
    for i in "$(cat fichier)";do
       sed -i '/'"${i//\//\\/}"'/d'  "$nom"
    done
    rm fichier fichier2;;
    quelqu'un a une idée?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    d'abord, ce n'est pas comme ça (for i in "$(cat fichier)";do) qu'on lit un fichier en shell, mais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do : whatever with "$line"; done
    parce que for lit des mots, pas des lignes.

    ensuite, le recours aux fichiers temporaires est une mauvaise pratique : cela requiert des accès disques qui ralentissent le script, tout comme l'emploi de commandes externes (tr, cut...).

    enfin, je te l'ai déjà demandé, il nous faut des données (saisie, extrait représentatif de fichier) pour analyser le comportement du script.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    zenity retourne le nom des fichier,avec leur chemein,séparés par une barre verticale
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /media/mathieu/WALKMAN/MUSIC/bon_funk/calif_so.mp3|/media/mathieu/WALKMAN/MUSIC/bon_funk/carleen_.mp3|/media/mathieu/WALKMAN/MUSIC/bon_funk/darkness.mp3|/media/mathieu/WALKMAN/MUSIC/bon_funk/freedom_.mp3

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    et le fichier duquel supprimer des lignes ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    c'est un fichier m3u. chaque ligne un fchier avec un chemin relatif
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    cat /media/mathieu/WALKMAN/MUSIC/dolly.m3u 
    Dolly\Dolly-Plein_air\01.Un_peu_de_mer.mp3
    Dolly\Dolly-Plein_air\02.Cest_pour_toi.mp3
    Dolly\Dolly-Plein_air\03.Comment_taire.mp3
    Dolly\Dolly-Plein_air\04.Il_fait_si_bon.mp3
    Dolly\Dolly-Plein_air\05.Matins_dencre.mp3
    Dolly\Dolly-Plein_air\06.To_Be_Loved.mp3
    Dolly\Dolly-Plein_air\07.Un_homme_éternel.mp3
    Dolly\Dolly-Plein_air\08.Under_the_Bridge.mp3
    Dolly\Dolly-Plein_air\09.Liquide_électrique.mp3
    Dolly\Dolly-Plein_air\10.U_Cant_Hide.mp3
    Dolly\Dolly-Plein_air\11.God.mp3
    Dolly\Dolly-Plein_air\12.Que_du_bô.mp3
    Dolly\Dolly-Plein_air\13.Tim.mp3
    Dolly\Dolly-Plein_Air_Bonus\01.Elles_dorment_déjà.mp3
    Dolly\Dolly-Plein_Air_Bonus\02.Allways_on_my_mind.mp3
    Dolly\Dolly-Plein_Air_Bonus\03.Sweet_Jane.mp3
    Dolly\Dolly-Plein_Air_Bonus\04.You_cant_hide.mp3
    Dolly\Dolly-Plein_Air_Bonus\05.Un_peu_de_mer.mp3
    Dolly\Dolly-Plein_Air_Bonus\06.Matins_dencre.mp3
    Dolly\Dolly-Plein_Air_Bonus\07.Lhiver.mp3
    Dolly\dolly - sunday afternoon\001 No One But You.mp3
    Dolly\dolly - sunday afternoon\002 Angel (Version Anglaise).mp3
    Dolly\dolly - sunday afternoon\003 Don't Lose That Feeling.mp3
    Dolly\dolly - sunday afternoon\004 Sometimes.mp3
    Dolly\dolly - sunday afternoon\005 Sunday Afternoon.mp3
    Dolly\dolly - sunday afternoon\006 Un Jour De RИves.mp3
    Dolly\dolly - sunday afternoon\007 Years Go By.mp3
    Dolly\dolly - sunday afternoon\008 Nothing.mp3
    Dolly\dolly - sunday afternoon\009 I Love Your Hands.mp3
    Dolly\dolly - sunday afternoon\010 Colouring.mp3
    Dolly\dolly - sunday afternoon\011 Love And Money.mp3
    Dolly\dolly - sunday afternoon\012 Never.mp3
    Dolly\dolly - sunday afternoon\013 RВgis.mp3
    Dolly\Tous des stars\Disc 1 - 01 - Tatutia.mp3
    Dolly\Tous des stars\Disc 1 - 02 - Au paradis.mp3
    Dolly\Tous des stars\Disc 1 - 03 - Tous des stars.mp3
    Dolly\Tous des stars\Disc 1 - 04 - Machines.mp3
    Dolly\Tous des stars\Disc 1 - 05 - Il était une fois.mp3
    Dolly\Tous des stars\Disc 1 - 06 - Manga Tears.mp3
    Dolly\Tous des stars\Disc 1 - 07 - 7..mp3
    Dolly\Tous des stars\Disc 1 - 08 - Tout va bien.mp3
    Dolly\Tous des stars\Disc 1 - 09 - Faut y croire.mp3
    Dolly\Tous des stars\Disc 1 - 10 - Assez de nous.mp3
    Dolly\Tous des stars\Disc 1 - 11 - Les Bulles.mp3
    la barre oblique est un antislash car ce baladeur fonctionne comme ça
    une idée?

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    ben oui. les motifs ne correspondent pas !
    il faut supprimer le chemin vers le répertoire (ou le remplacer par le chemin affiché dans le fichier), et remplacer les slashes par des antislashes.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    sans utiliser tr,cut...?
    comment?

    en fait le fichier temporaire travaille avec des slash et quand vient le moment d'enregistrer dan le baladeur, c'est à ce moment qu'il change les slash par des antislash
    ça marche quand on enlève juste un fichier du m3u

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    alors pourquoi nous donner le m3u du baladeur ?
    il nous faut celui sur lequel le sed est appliqué.

    les fichiers temporaires seraient avantageusement remplacés par un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ wDir="/media/$USER/WALKMAN/MUSIC/"
    $ IFS='|' read -ra liste < <(zenity  --file-selection --multiple --filename "$wDir")
    $ for i in "${liste[@]}"; do i=${i##*$wDir"}; sed /'"${i//\//\\/}"'/d'  "$m3u"; done
    mais sans savoir précisément sur quoi et avec quoi on travaille, il n'est pas dit que ça fonctionne tel quel !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    le fichier du baladeur est un exemple. le fichier sur lequel on travaille est pareil, juste \ remplacé par /
    merci pour ces commandes. Sinon, pour la troisième commande, le shell attend une suite

  10. #10
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    le nom du fichier m3u est donné par l'utilisateur et est récupéré dans la variable $nom

  11. #11
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in "${liste[@]}"; do i=${i##*"$wDir"}; sed '/'"${i//\//\\/}"'/d'  "$m3u"; done
    ceci donne le contenu du fichier "$m3u"
    le script doit effacer plusieurs lignes, indiquées par l'utilisateur avec zenity
    une idée?

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    Citation Envoyé par matser Voir le message
    le fichier du baladeur est un exemple. le fichier sur lequel on travaille est pareil, juste \ remplacé par /
    ah, et c'est à moi de faire la conversion pour faire ton travail !?


    ceci donne le contenu du fichier "$m3u"
    probablement pas en entier...


    le script doit effacer plusieurs lignes, indiquées par l'utilisateur avec zenity
    tu ne vois rien près de la commande sed, qui pourrait empêcher la suppression souhaitée ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    je vais potasser un peu les tableau et le paramètres en bash et je reviendrais si il y a problème

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    à la place de la boucle for, qui exécute autant de fois sed que l'utilisateur a sélectionné de fichiers
    on peut faire comme ça :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ regex=$(IFS='|'; echo "${liste[*]//\//\\/}") # la regex aura cette forme : chemin\/fichier1|chemin\/fichier2|chemin\/fichierN. la | a valeur de OU
    $ sed -E -i '/'"$regex"'/d' "$m3u"             # sed est exécuté une seule fois
    ça va accélérer l'exécution du script.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ah, et c'est à moi de faire la conversion pour faire ton trava
    ben non, c'est déjà fait sinon le m3u du baladeur n'existerai pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/\//\\/g' "$m3u"
    j'ai pas encore exécuté les dernières commande, mais je vais le faire de suite

  16. #16
    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
    1
    2
    3
    4
    5
    zenity --file-selection --multiple --filename /media/$USER/WALKMAN/MUSIC/ | awk -vRS='|' 1
    /media/mathieu/WALKMAN/MUSIC/bon_funk/calif_so.mp3
    /media/mathieu/WALKMAN/MUSIC/bon_funk/carleen_.mp3
    /media/mathieu/WALKMAN/MUSIC/bon_funk/darkness.mp3
    /media/mathieu/WALKMAN/MUSIC/bon_funk/freedom_.mp3
    Et pour filtrer les lignes d'un fichier dans un autre fichier, on peut penser à grep, (ou remplir awk de regex)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -vf aExclure.txt fichierCible.txt
    Donc si tu es flemmard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zenity --file-selection --multiple --filename /media/$USER/WALKMAN/MUSIC/ | awk -vRS='|' 1 | grep -vf aExclure.txt -

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 666
    Par défaut
    Citation Envoyé par matser Voir le message
    ben non, c'est déjà fait sinon le m3u du baladeur n'existerai pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '/\//\\/' "$m3u"
    j'ai pas encore exécuté les dernières commande, mais je vais le faire de suite
    ce que je voulais dire, c'est que tu ne nous fournis pas le bon fichier, et que ce n'est pas à nous de convertir le fichier du baladeur (avec des \) au format UNIX, pour pouvoir t'aider.

    je ne comprends pas ce que tu fais.
    • tu récupères le fichier .m3u du baladeur vers ton PC
    • tu convertis les antislashes (\) en slashes (/)
    • tu sélectionnes les fichiers présents sur ton PC que tu veux supprimer du .m3u
    • tu convertis les slashes (/) en antislashes (\)
    • tu renvoies le .m3u vers le baladeur

    c'est ça ?i ll faut nous expliquer.

    je n'utilise pas zenity, donc je ne sais pas... il n'y a pas moyen d'utiliser le .m3u pour faire une liste de cases à cocher ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 417
    Billets dans le blog
    16
    Par défaut
    c'est presque ça:
    • donner un nom à la nouvelle liste
    • ajouter des mp3 du disque dur ou autre
    • possibilité d'en enlever, puis en ajouter d'autres etc...
    • copier le m3u dans le baladeur après avoir converti / en \


    @Flodelarab
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ m3u=nom de la liste
    $ zenity --file-selection --multiple --filename /media/$USER/WALKMAN/MUSIC/ | awk -vRS='|' 1 > fichier
    $ grep -vf fichier "$m3u"
    après ça, les lignes de "$m3u" n'ont pas été enlevé.
    faut-il faut enlever le "/media/$USER/WALKMAN/MUSIC/" de "fichier"?

  19. #19
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je n'utilise pas zenity, donc je ne sais pas... il n'y a pas moyen d'utiliser le .m3u pour faire une liste de cases à cocher ?
    Tout à fait, il faut "parser" le m3u et mettre les titres et numéro de ligne dans une liste
    format : FALSE no_ligne "titre"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    choix=(FALSE  1 "pierre" FALSE 2 "paul" TRUE 3 "arlette")   # ici, ligne 3 est l'intruse
    response=$(zenity --list --checklist --separator=" " --width=600 --height=450 \
            --title "Filtre musiques" \
            --text="Sélectionner les musiques à supprimer" \
            --column="Supprimer ?" --column="id" --column="Musique"  \
            "${choix[@]}" \
     );
    echo "${response[@]}"
    ici, $response est la liste des lignes à supprimer (ou garder... suivant le label du dialogue)

  20. #20
    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 matser Voir le message
    après ça, les lignes de "$m3u" n'ont pas été enlevé.
    faut-il faut enlever le "/media/$USER/WALKMAN/MUSIC/" de "fichier"?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zenity | awk -vRS='|' -F/ '{print $NF;}' | grep -vf - "$m3u"

Discussions similaires

  1. [Débutant] enlever des ligne d'un tableau de cellules selon des conditions
    Par gegon dans le forum MATLAB
    Réponses: 5
    Dernier message: 18/01/2013, 14h15
  2. sed enlever des saut de ligne
    Par ldiaz dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 11/02/2012, 14h17
  3. Enlever des lignes liées à la caméra
    Par ThomB. dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 06/05/2010, 11h26
  4. RSS enlever des lignes pour alléger le XML
    Par goldor dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 20/07/2009, 14h46
  5. [DOM] enlever des lignes dynamiquement DOM + PHP
    Par beyo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/01/2009, 15h19

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