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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    396
    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 : 396
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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
    396
    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 : 396
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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
    396
    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 : 396
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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 prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par matser Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo $tmp>fichier
    tr "|" "\n" <fichier>fichier2
    cut -d/ -f 6- fichier2 > fichier
    ...
    rm fichier fichier2;;
    En plus des doubles point-virgules totalement inutiles (écrire du code inutile c'est au-mieux un signe d'incompréhension des choses et au pire du temps cpu pour rien), comme l'a dit N_BaH, créer des fichiers temporaires est assez malsain (le disque est 1000 fois moins rapide que la mémoire).

    Surtout qu'il existe une astuce à base de canal se comportant comme un fichier.
    Exemple: remplacer ":" par ";" dans un fichier toto
    Solution à base de fichier temporaire
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -e "s/:/;/" toto >tmp
    mv tmp toto

    Solution à base de canal
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<toto
    rm -f toto
    sed -e "s/:/;/" 0<&3 >toto
    Voilà. On crée un nouveau canal IO numéro 3 (0, 1 et 2 étant déjà pris) qui récupère le fichier à traiter. Et on peut aller comme ça jusqu'à 64 ce qui est assez large (m'étonnerait que quelqu'un ait déjà dépassé 5 !!!).
    L'inconvénient majeur est la suppression impérative du fichier après l'avoir relié au canal numéroté. Sinon la redirection (s'il n'est pas supprimé) commence par le vider et donc le canal 3 est alors vidé par ricochet. Donc si le script s'interrompt avant la fin, on a perdu le fichier initial. Sinon ça marche super bien (le canal est créé en RAM et j'ai testé sur des fichiers de plusieurs giga, le truc n'a pas tremblé d'un poil)

    Si maintenant le fichier temporaire est impératif, alors il faut utiliser de bonnes pratiques
    • travailler dans $HOME/tmp (ou éventuellement dans /tmp qui est purgé à chaque reboot)
    • utiliser des noms uniques en cas de collision potentielle (imagine que ton script soit appelé plusieurs fois en parallèle). La variable "$$" (pid courant) peut être utile pour ça. Et il existe des commandes spécifiques pour créer des fichiers temporaires de façon sûre (mktemp, tempfile)

    Bref travailler avec des fichiers temporaires demande une part de réflexion à part entière dans l'algorithme et ne se contente pas simplement d'un bête "sed truc >tmp"...
    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]

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