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 :

Incompréhension syntaxe shell


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2011
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 18
    Par défaut Incompréhension syntaxe shell
    Bonjour,

    Merci de m'expliquer ce qu'est censé faire cette commande :
    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '$d' "dossier1/fichier.csv" >  "dossier1/fichier.csv"
    Il me semble que le fichier est copié de dossier1 vers dossier2, mais je ne comprend pas le $d.
    J'ai essayé de faire des recherches mais pas facile de trouver ce que je veux avec ces caractères spéciaux.

    Merci de votre aide.

    Cordialement.

    PS : si vous pouvez aussi me dire ce que '$?' représnte...

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    "$" matche la dernière ligne. "d" supprime la ligne. Cette commande supprime donc la dernière ligne du fichier.

    A noter qu'il est incorrecte d'écrire dans le fichier qu'on est en train de lire, comme on le fait ici. Avec un peu de chance ça peut donner l'impression que ça marche sur de petits fichiers, mais pour des fichiers plus gros tu te retrouvera généralement avec un fichier vide.

    Il faut soit écrire dans un fichier différent, soit utiliser le flag -i, qui est fait pour ça.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Par défaut
    Citation Envoyé par matafan Voir le message
    A noter qu'il est incorrecte d'écrire dans le fichier qu'on est en train de lire, comme on le fait ici. Avec un peu de chance ça peut donner l'impression que ça marche sur de petits fichiers, mais pour des fichiers plus gros tu te retrouvera généralement avec un fichier vide.

    Il faut soit écrire dans un fichier différent, soit utiliser le flag -i, qui est fait pour ça.
    tout à fait exact ! C'est une vilaine erreur. Tant que le fichier est de la taille du buffet, ça va rouler, parce que son contenu sera stocké en mémoire et donc réécrit dans le fichier. Au-delà, fichier vide !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    Avec un peu de chance ça peut donner l'impression que ça marche sur de petits fichiers, mais pour des fichiers plus gros tu te retrouvera généralement avec un fichier vide.
    Citation Envoyé par thierry.chich Voir le message
    tout à fait exact ! C'est une vilaine erreur. Tant que le fichier est de la taille du buffet, ça va rouler, parce que son contenu sera stocké en mémoire et donc réécrit dans le fichier. Au-delà, fichier vide !
    Salut
    Non non même sur des fichiers minuscules il n'y a aucune chance que ça fonctionne. Car dès qu'il voit un redirection, le shell commence par créer le fichier de destination vide (ou le vider s'il existe déjà). Donc quelle que soit sa taille et quelle que soit la taille du buffer, on se retrouve toujours avec un fichier en final vide.

    Toutefois il existe quand-même un moyen de faire un traitement sur un fichier en le réécrivant. Il suffit de passer par les canaux numérotés. Le 0, 1 et 2 étant déjà utilisés on peut prendre le 3 (ou 4 ou...)
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<"dossier1/fichier.csv"
    rm -f "dossier1/fichier.csv"
    sed ... 0<&3 > "dossier1/fichier.csv"
    Et ça, ça fonctionne sur des fichiers même super gros (suis déjà allé jusqu'à 4G sans souci). Toutefois, l'effacement étant obligatoire (pour que la redirection crée un fichier différent de celui relié au canal 3), s'il y a une interruption entre le rm et le traitement alors...
    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. #5
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par chekchouka Voir le message
    Bonjour,

    Merci de m'expliquer ce qu'est censé faire cette commande :
    sed '$d' "dossier1/fichier.csv" > "dossier1/fichier.csv"
    Il me semble que le fichier est copié de dossier1 vers dossier2, mais je ne comprend pas le $d.
    J'ai essayé de faire des recherches mais pas facile de trouver ce que je veux avec ces caractères spéciaux.

    Merci de votre aide.

    Cordialement.

    PS : si vous pouvez aussi me dire ce que '$?' représnte...

    $d est une commande sed et comme indiqué par matafan, c'est juste pour virer la dernière ligne

    quand à $? c'est un retour au niveau shell
    typiquement le code retour de la dernière commande passée, classiquement 0 est sencé réeprésenté un OK et 1 un KO, mais c'est pas tjrs si simple, et il peut y avoir d'autres valeurs.

    pour sed une aide précieuse : http://sed.sourceforge.net/sed1line.txt

  6. #6
    Membre averti
    Inscrit en
    Février 2011
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 18
    Par défaut
    Merci de votre rapidité. ça répond parfaitement à mes questions. En fait c'est un script qui existe déjà et que je ne comprend pas totalement, et j'ai du mal à faire des recherches claires sur les points qui me posent pb à cause des caractères spéciaux :-)

    Bonne journée.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par frp31 Voir le message
    pour sed une aide précieuse : http://sed.sourceforge.net/sed1line.txt
    Merci beaucoup pour le lien!
    Je confirme: très précieux (ainsi que tout le site http://sed.sourceforge.net)

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/08/2014, 12h34
  2. erreur dans ma syntax shell
    Par Mr_Taoufik dans le forum Linux
    Réponses: 3
    Dernier message: 29/03/2012, 15h25
  3. Incompréhension syntaxe de code
    Par cr4sh.64 dans le forum C++
    Réponses: 3
    Dernier message: 19/04/2011, 10h13
  4. Syntax error incompréhensible dans script shell!
    Par Sakesannin dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/01/2010, 18h41
  5. Syntaxe dans un script shell
    Par cubepiege dans le forum Linux
    Réponses: 5
    Dernier message: 27/09/2005, 16h21

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