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. #21
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 849
    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 849
    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]

  2. #22
    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 matser Voir le message
    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 \
    non, n'importe quoi: ajouter des mp3 du baladeur dans la iste

  3. #23
    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 faire ça en C++, je connais un peu mieux

  4. #24
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 849
    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 849
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matser Voir le message
    je vais faire ça en C++, je connais un peu mieux
    - Bonjour, je voudrais relier ces deux planches mais j'ai du mal
    - Oui, il faut un petit peu de techique. Tenir le clou par le bas, tenir le marteau ni trop près de la tête (pas assez de puissance) ni trop loin (pas assez de précision), taper bien perpendiculairement, ...
    - Ok, je vais utiliser du fil à coudre et des aiguilles, je connais un peu mieux

    Aucun langage de programmation n'est parfait, a dit Herbert Mayer. Il n'existe même pas un langage meilleur qu'un autre, seulement des langages adaptés à des buts. Le C/C++ est certainement très bien pour écrire des drivers, programmer un SE, diriger un robot. Mais pour filtrer les mp3 de ton balladeur et les sélectionner dans une mini-ihm... Tu aurais dit "Python" ok mais C++... Enfin vu que tu le connais "un peu" mieux...
    https://perso.crans.org/besson/publi...ris-au-maillet
    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]

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Tu l'as découragé avec tes grands textes, alors que je fais son objectif en une seule ligne.

  6. #26
    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
    Ecrire une GUI en C oui, c'est simple et rapide

    je ne suis pas sur de savoir ce qui te bloque , tes "tr cut sed awk" que tu as dans ton code ?
    Code : 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;;
    bash est un vrai language, donc il est possible de s'en passer (tes fichiers sont petits et de structure simple "artiste\album\fichier")

    Je t'ai déja donné le code pour afficher/choisir une musique dans une liste en GUI, parser le fichier et le transformer peut-être fait en bash (donc, à une sauce plus proche d'autres languages de programmation, normalement plus compréhensible pour un dev C++) et ... sans utiliser de fichiers temporaires()

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    fichierliste="./truc.m3u"
     
    # création d'un mock
    echo -n '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\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
    ' > "$fichierliste"
     
    # charge fichier et convertion vers zenity $choix
    declare -a choix
    declare -a filecontent
    declare -i i=0
    while IFS=: read -r line; do
        ((i+=1))
        filecontent+=("$line")
        IFS='\' read -ra  musique <<< "$line"
        choix+=(FALSE $i "${musique[1]}" "${musique[2]//_/ }" "${musique[0]}")
    done < "$fichierliste"
     
     
    response=$(zenity --list --checklist --separator=" " --width=600 --height=450 \
            --title "Filtre musiques" \
            --text="Sélectionner les musiques à supprimer de ${musique[0]}" \
            --hide-column=2 --print-column=2 \
            --column="Supprimer ?" --column="id" --column="Album" --column="Chanson" --column="Artiste" \
            "${choix[@]}" \
            2>/dev/null
     );
    [[ $? -eq 1 ]] && exit 8   # btn annuler
    response=(${response}) 
     
     
    # Filtre par no de ligne
    i=0
    for fichier in "${filecontent[@]}"; do
        ((i+=1))
        if [[ $i == "${response[0]}" ]]; then
            response=("${response[@]:1}")
            echo "# NOT use line $i" >&2
        else
            echo "${fichier//\\/\/}"  # remplace antislash par slash si nécessaire ?
            # ici sortie écran, a rediriger vers fichier
        fi
    done
    unset filecontent
    unset choix
    unset response
    -----------
    Fichiers temporaires

    En fait, il n'y a rien de nouveau en bash, on fait exactement la même chose en C++, donc difficile de comprendre pourquoi tu ne le fais pas ici
    - utiiser une fonction pour obtenir dans /tmp un répertoire avec un nom unique
    - un hook de sortie pour supprimer le répertoire (possible en bash)

    Note: parfois, avec linux /tmp/ est monté en ram donc très rapide

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