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 :

Récupérer caractère code ascii 10


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut Récupérer caractère code ascii 10
    Bonjour à tous
    Tout est dans le titre: je n'arrive pas à récupérer le caractère "\n" représenté par le code ascii 10 dans une variable.

    J'ai pourtant tout essayé. Tout d'abord la soluce de N_Bah dans une discussion analogue ici en tapant var="$(echo 10 |awk '{printf("%c", $1)}')". Ou une autre en tapant var="$(echo -e "\012")" mais rien n'y fait, Quand ensuite je tente echo "x${var}y" j'ai un bête "xy" alors que j'espérais avoir "x\ny".

    En fait, ma "$var" reste désespérément vide. Je peux même taper test -z "$var" && echo "vide" et j'ai bien "vide" qui apparait. Ou alors echo "x${var}y" >f1; echo "xy" >f2; cmp f1 f2 et ça me renvoie rien indiquant alors que f1 et f2 sont identiques.

    Pourtant à la base ça fonctionne car en tapant par exemple echo -e "\012" >fic ; od -x fic je vois bien "0a0a" (le premier vient de la conversion octale et le second a été envoyé par le "echo" lui-même comme il le fait à chaque fois qu'on n'invoque pas le "-n". Mais même là si je rajoute echo "x$(cat fic)y" je n'obtiens rien de plus que si j'avais tapé echo "xy".

    Si quelqu'un a une idée...

    Merci de votre attention
    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. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,
    Une solution en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read -d ':' XX < <(echo -en "\012:")
    $ echo "x${XX}y"
    x
    y
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Citation Envoyé par Sve@r Voir le message
    Tout est dans le titre: je n'arrive pas à récupérer le caractère "\n" représenté par le code ascii 10 dans une variable.
    C'est plutôt que tu aimerais forcer le comportement de "echo" qui ne prend pas en compte les \n par défaut.

    Citation Envoyé par Sve@r Voir le message
    Si quelqu'un a une idée...
    L'idée, tu l'as déjà donnée: c'est d'utiliser "-e" pour interpréter les contre-obliques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ a="\n"
    $ echo x${a}y
    x\ny
    $ echo -e x${a}y
    x
    y
    $ echo -e x${a}y |od -c
    0000000   x  \n   y  \n
    0000004
    Maintenant, "echo" n'est pas le seul outil capable d'affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ printf "x${a}y\n"
    x
    y
    La méthode de disedorgue ne marche pas chez moi.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    j'y vais de ma proposition également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ var="
    "
    $ echo -ne "$var" | hexdump -C
    00000000  0a                                                |.|
    $ echo "X${var}Y"
    X
    Y
    à l'inverse je confirme le comportement que tu décris plus haut Sve@r :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ var="$(echo 10 |awk '{printf("%c", $1)}')"
    $ echo -ne "$var" | hexdump -C
    $ var="$(echo -e "\012")"
    $ echo -ne "$var" | hexdump -C
    Edit: idem chez moi la solution de disedorgue n'a pas fonctionné
    Edit2: en rajoutant un IFS=':' devant ça tourne en fait

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Je confirme la remarque de BufferBob, il faut aussi positionner l'IFS ou bien utiliser directement la variable REPLY:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ IFS='' read -d ':' XX < <(echo -e "\012:")
    $ echo "a${XX}b"
    a
    b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ read -d ':' < <(echo -e "\012:")
    $ echo "a${REPLY}b"
    a
    b
    Sinon, on peut aussi passer par printf au lieu de echo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ printf -vXX "%b" "\012"
    $ echo "a${XX}b"
    a
    b
    Cordialement.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous. Merci de vos réponses et pardon pour le retard, je me suis absenté une semaine.

    Alors ok j'ai effectivment manqué un truc avec le echo -e (merci à Flodelarab) et dans ce cas a="\n"; echo -e "x${a}y" tout va bien mais ça n'a pas résolu mon soucis.

    En fait, (pour ceux qui connaissent (Flodelarab, Bktero) c'est sur le site de petits challenges de prog) je me retrouve en fin de code aves différentes valeurs ascii. Exemple 65 10 66. Et il me faut afficher la chaine correspondante (c'est dans le puzzle communauté "CGFunge").

    J'ai alors écrit une fonction qui convertit ce code ascii en caractère.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chr()
    {
        echo "$1" | awk '{printf("%c", $1)}'
    }

    Ben cette fonction fonctionne (super la redondance !!!) pour tout... sauf pour le 10.

    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ for i in $(seq 255); do
    > test -z "$(chr $i)" && echo "$i vide"
    > done
    10 vide
    $

    Et là, j'ai beau chercher je ne vois pas de phénomène "echo -e" entrer en jeu.

    Bon, ceci dit il n'y a rien de catastrophique. J'ai juste rajouté un test $c -eq 10 dans mon code avant d'appeler ma fonction et ça a fonctionné mais ça m'intrigue tout de même... Peut-être à cause de la façon dont "awk" affiche son résultat...

    Merci encore de vos réponses qui m'ont appris des trucs (pas mal celle de Disedorgue qui utilise "-v" pour remplir directement la variable. - Je l'utiliserais presque mais me faudrait alors convertir le code ascii en valeur octale et bon, vu l'enjeu je pense faire l'impasse sur ce travail )
    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]

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Non, ici, tu es juste borderline, il faut voir ça comme un fichier et la fameuse ligne vide (qui dans les faits, ne l'est pas).
    Le souci ne vient pas du awk mais du shell et de la façon qu'il traite les fins de ligne d'un fichier.
    Là, tu attend le stdout de ta fonction pour construire ta chaine.
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Ben cette fonction fonctionne (super la redondance !!!) pour tout... sauf pour le 10.
    Euh... j'imagine que tu vas jusqu'à 255 car c'est un octet.
    Donc tu commences à 0.
    Et 0 doit donner:
    seq 0 255, si tu veux commencer à 0 et pas 1, (par défaut).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Donc tu commences à 0.
    seq 0 255, si tu veux commencer à 0 et pas 1, (par défaut).
    Euh... certes mais en fait le but de mon exemple était de montrer la spécificité du 10. J'aurais pu pour ça tout aussi bien écrire seq 8 15.

    Citation Envoyé par Flodelarab Voir le message
    car c'est un octet.
    Pour être précis, il s'agit soit d'un octet imprimable, soit la valeur 10, soit une autre valeur numérique mais dans ce cas le déroulement du code fait que cette valeur numérique est alors soit juste utilisée dans un calcul, soit juste affichée telle quelle et non comme caractère. Et mon problème est survenu quand la valeur était "10" (pas 0 car ça n'arrive jamais) et qu'il fallait l'afficher comme caractère.
    En fait il s'agit d'écrire un compilateur style "Brainfuck" mais où le code à exécuter se déroule non pas sur un ruban mais dans un rectangle. Donc selon certains cas, le caractère suivant à lire se trouve en dessous (ou au dessus) du caractère lu. Mis à part ça rien de bien spécial par rapport à Brainfuck. On lit et on évalue. Tu devrais aller voir car tu connais ce site. C'est dans "Puzzle communauté" et c'est le puzzle "CG Funge". Je l'ai résolu en Python, en C++ et en shell (et là je suis le seul )...
    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]

  10. #10
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    En fait il s'agit d'écrire un compilateur style "Brainfuck"
    ou Befunge

Discussions similaires

  1. Comment récupérer le code ASCII d'un caractère?
    Par Blue_Strike dans le forum Delphi
    Réponses: 6
    Dernier message: 04/05/2007, 00h38
  2. [C#] Caractère code ASCII
    Par helios77 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 16/04/2007, 01h31
  3. Réponses: 6
    Dernier message: 18/09/2006, 15h06
  4. affichage caractère à partir du code ascii
    Par capone dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2005, 21h51
  5. [PERL]Remplacer un caractère dans on a le code ASCII
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 30/09/2005, 15h13

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