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 POSIX Discussion :

Problème avec sed et fichier texte [OS X] [SH]


Sujet :

Shell et commandes POSIX

  1. #1
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut Problème avec sed et fichier texte
    Bonjour a tous,

    Via les commandes AppleScript do shell script, j'utilise les commandes du terminal OS X afin de créer un fichier texte

    pour créer mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touch '/Users/UserName/Desktop/Scripts/HOT FOLDER/PDF HD_OUT/Mon_fichier1.txt'
    Pour ajouter des lignes dans mon fichier (PS: il se peut que monTexte (dans le code ci-dessous) représente l'insertion de plusieurs lignes en une fois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "monTexte" >> '/Users/UserName/Desktop/Scripts/HOT FOLDER/PDF HD_OUT/Mon_fichier1.txt'

    • Le problème avec sed , j'aimerai supprimer la ligne 1 (ou une autre) mais cela ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '' '1d' '/Users/UserName/Desktop/Scripts/HOT FOLDER/PDF HD_OUT/Mon_fichier1.txt'
    En faisant des tests, j'ai ré-ouvert le fichier texte et remplacer manuellement les retours chariot, puis retenter le code ci-dessus, et là ça marche …

    Qu'ai je fais comme erreur et comment je peux y remédier ??

    Merci d'avance pour l'aide
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Il est très important de prendre conscience que les fichiers texte ont souvent une fin de ligne en
    • \r\n CRLF pour Windows
    • \n pour Unix/Linux
    • \r pour Mac


    Les outils POSIX vont considérer \n. Donc si ton fichier n'a que des \r, alors il ne verra qu'une ligne. Possible alors que la destruction de la première ligne provoque la disparition de tout le fichier.

    Soit tu changes les fins de ligne.
    Soit tu précises ta fin de ligne à l'outil qui l'accepte. exemple:
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Si je veux le forcer comme tu me le proposes, dois-e l'écrire comme cela ?? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "monTexte" | awk -vRS='\r' >> '/Users/UserName/Desktop/Scripts/HOT FOLDER/PDF HD_OUT/Mon_fichier1.txt'
    Edit : j'ai testé, mais je dois mal m'y prendre
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  4. #4
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Info supp. :

    En faisant des tests dans Applescript et le terminal (ensemble et aussi directement avec le terminal sans Applescript) :
    j'ai une variable de texte de plusieurs lignes, si je l'a fait passer en une fois via echo (j'utilise le return pour la découpe des lignes dans Applescript ce qui revient à \r)
    le code de suppression avec sed ne marche pas
    par contre si je fais passer les lignes une à une avec echo le code de suppression de ligne avec sed marche

    j'aimerais donc avoir un contournement pour passer la variable texte en une fois et que sed marche.
    Quel serait la meilleurs solution avec le terminal ?? repasser une commande corrigeant le tir ?? autre ??

    Edit :
    Avec un autre test, quand je met toutes les lignes en une seule fois avec echo, en effet lorsque je veux supprimer la ligne 1, tout est alors supprimer.
    Y a t-il un moyen de reconnaitre les caractères de fin de lignes afin de savoir par quoi les remplacer via le terminal ??

    PS : le fait que les retours chariot des lignes se trouvent entre les guillemets du string de la variable texte dans AppleScript, doit surement poser problème au code du terminal avec echo,
    il faudrait alors pouvoir faire cette découpe avec une ligne de commande supplémentaire, mais comment … ?
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  5. #5
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour Flodelarab et au forum,

    J’ai fait pas mal de tests afin de comprendre et de voir ce qui est possible de faire.
    - J’ai remplacé par le caractère adéquat (sur Mac \r)
    - awk -vRS='\r' => je n’ai pas réussi à l’utiliser
    - j’ai fait des remplacements via sed

    Et malheureusement pour l’instant rien y fait …

    Ce qui est sur, c’est que ma variable texte qui est envoyé par echo , ressemble à cela :
    "Texte du paragraphe 1
    Texte du paragraphe 2
    Texte du paragraphe 3
    Texte du paragraphe 4
    Texte du paragraphe 5"
    Et le retour ligne qui sont dans le string sont des return
    je pourrai mettre \r à la place de return se serait pareil
    Je n’ai pas trouvé de solution pour l’instant mis à part passer chaque ligne une à une via echo

    Edit : ma question est, comment faire pour que echo envoi et considère ma variable string de cette manière (dans le fichier texte) :
    Texte du paragraphe 1\d
    Texte du paragraphe 2\d
    Texte du paragraphe 3\d
    Texte du paragraphe 4\d
    Texte du paragraphe 5\d
    \d en grisé afin de le montré se manière schématique
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$texte" | sed 's/\r/\n/g' | sed '1d'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$texte" | sed 's/[^\r]*\r//;s/\r/\n/g'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Flodelarab,

    grâce à tes indication/codes …
    • \r\n CRLF pour Windows
    • \n pour Unix/Linux
    • \r pour Mac

    Les outils POSIX vont considérer \n. Donc si ton fichier n'a que des \r, alors il ne verra qu'une ligne. Possible alors que la destruction de la première ligne provoque la disparition de tout le fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$texte" | sed 's/[^\r]*\r//;s/\r/\n/g'
    … et le moult tests que j'ai fait, j'ai fini par comprendre le fonctionnement du code dans Applescript pour utiliser les commandes du terminal …
    Du coup les tests finaux sont ok aussi bien du coté d'AppleScript que du terminal seul

    Donc au final c'est bien \n que je dois utiliser afin que mon fichier texte soit correct,
    j'ai mis un peu de temps, mais à mélanger 2 types de codes on peut s'embrouiller …

    En tout cas j'ai réussi grâce à toi (de plus le peu de code que tu m'as mis me donne un aperçu de l'écriture de Sed ).

    Grand Merci
    Ryu

    Edit : Ha oui j’oubliai, je n'ai pas su utiliser :est il possible de me donner un exemple de fonctionnement stp - merci
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Donc au final c'est bien \n que je dois utiliser afin que mon fichier texte soit correct,
    Avec le terminal et l'interpréteur bash, c'est certain !

    awk -vRS='\r'
    Avec awk, FS = Field Separator et RS=Record Separator. FS par défaut est l'espace et RS par défaut est la fin de ligne \n.
    Ceci permet de retraiter des fichiers texte, comme ceci, par colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    server database user profiletarget
    server1 database1321 user21 profiletarget2
    server127 database2 user1 profiletarget3555
    Mais dons ton cas, on peut redéfinir le RS. Ainsi, l'équivalent de ce que je t'ai fourni avec sed s'écrirait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "$texte" | awk -vRS='\r' '(NR>1)'
    Si tu utilises Apple, sans doute préféreras-tu garder les fins de ligne en \r.
    Mais si tu veux utiliser largement le terminal, passer à des fins de ligne en \n est indispensable.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Merci pour toutes ces précisions, c'est beaucoup plus claire

    Ryu
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/04/2007, 14h22
  2. [TSaveDialog] Problèmes avec type de fichier
    Par Pedro dans le forum Delphi
    Réponses: 14
    Dernier message: 14/12/2006, 21h53
  3. probleme avec un import fichier texte dans mysql
    Par xodeax dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/07/2006, 13h24
  4. Problème de réouverture de fichier texte
    Par EssaiEncore dans le forum Langage
    Réponses: 15
    Dernier message: 14/12/2005, 10h51
  5. Réponses: 18
    Dernier message: 30/06/2005, 13h30

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