[shell] fin de ligne

Résolu
tibofx Messages postés 14 Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
J'ai un doute sur mon script...
Avec un while read, je lis un fichier ligne par ligne, et chaque ligne caractère par caractère, et je voudrais qu'à chaque fois que j'arrive en fin de ligne, effectuer des opérations spéciales. (dans mon cas écrire des lignes de 0).
L'idée serait: if (caractere courant == "\n") then printf "0 0 0 0"
C'est possible une telle chose ?
Configuration: Linux
Firefox 2.0.0.11

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    T'as pas un exemple concret (avant => après) s'il te plaît, ainsi qu'un aperçu de ton script... merci ;-))
    0
  2. tibofx Messages postés 14 Statut Membre
     
    while read line; do
    r=1
    printf "\n#Input\n" >> res.pat;
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    while [ $r -le 106 ] ; do
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    case $tmp in
    "=") printf "1 0 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "A") printf "0 1 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "a") printf "0 0 1 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "B") printf "0 0 0 1 0 0 0 0 0 0 0\n" >> res.pat ;;
    "b") printf "0 0 0 0 1 0 0 0 0 0 0\n" >> res.pat ;;
    "C") printf "0 0 0 0 0 1 0 0 0 0 0\n" >> res.pat ;;
    "c") printf "0 0 0 0 0 0 1 0 0 0 0\n" >> res.pat ;;
    "D") printf "0 0 0 0 0 0 0 1 0 0 0\n" >> res.pat ;;
    "d") printf "0 0 0 0 0 0 0 0 1 0 0\n" >> res.pat ;;
    "E") printf "0 0 0 0 0 0 0 0 0 1 0\n" >> res.pat ;;
    "e") printf "0 0 0 0 0 0 0 0 0 0 1\n" >> res.pat ;;
    "\n") (et là je fais mes 0...);;
    ...etc...

    et ce que j'obtiens, avec une phrase du type :
    A=B==a==A=a=B===a=Aa==B======a===B====d===A==b=a,
    c'est :
    #Input
    0 1 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 0 0 0 0
    et en gros, je voudrais, quelle que soit le nombre de caractere dans la phrase, avoir un format fixe :
    coder chaque caractere par une serie de 0 et de 1,
    et coder par onze "0" si le nombre de caractere dans la phrase est inférieur à 106, et ce jusquà obtenir 106 lignes..
    C'est plus clair ??
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Alors, peut être y-a-t-il mieux, mais pour l'instant je te propose de substituer le saut de ligne final (\n) par un caractère quelconque (§ par exemple), et de faire ton ultime test dans la condition du "case" avec...
    Dans l'exemple qui suit, j'ai raccourci la longueur de la ligne (10 caractères) et sur 2 lignes
    #! /bin/bash
    
    #set -xv
    
    while read line; do
    line=$(echo $line | tr '\n' '§')
    r=1
    printf "\n#Input\n" >> res.pat;
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    while [ $r -le 11 ] ; do
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    case $tmp in
    "=") printf "1 0 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "A") printf "0 1 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "a") printf "0 0 1 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "B") printf "0 0 0 1 0 0 0 0 0 0 0\n" >> res.pat ;;
    "b") printf "0 0 0 0 1 0 0 0 0 0 0\n" >> res.pat ;;
    "C") printf "0 0 0 0 0 1 0 0 0 0 0\n" >> res.pat ;;
    "c") printf "0 0 0 0 0 0 1 0 0 0 0\n" >> res.pat ;;
    "D") printf "0 0 0 0 0 0 0 1 0 0 0\n" >> res.pat ;;
    "d") printf "0 0 0 0 0 0 0 0 1 0 0\n" >> res.pat ;;
    "E") printf "0 0 0 0 0 0 0 0 0 1 0\n" >> res.pat ;;
    "e") printf "0 0 0 0 0 0 0 0 0 0 1\n" >> res.pat ;;
    "§") printf "0 0 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    esac
    r=$((r+1))
    done
    done < <(echo -e "A=B==a==A=\n=B===Ded=A")
    Et si j'ai bien compris, si la ligne ne fait pas "106" caractères, finir de remplir par des "0" (11 par lignes), donc tu peux rajouter un test avec "sed" par exemple :
    #! /bin/bash
    
    #set -xv
    
    while read line; do
    line=$(echo $line | tr '\n' '§')
    
    nbr=$(echo "$line" | wc -l)
    if [ "$nbr" -le "11" ]
    then
    line=$(echo "$line" | sed -e ':boucle;s/^.\{1,11\}$/&§/; t boucle')
    fi
    
    r=1
    printf "\n#Input\n" >> res.pat;
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    while [ $r -le 11 ] ; do
    tmp=$(echo $line | awk '{print substr($0,'"$r"',1)}')
    case $tmp in
    "=") printf "1 0 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "A") printf "0 1 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "a") printf "0 0 1 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    "B") printf "0 0 0 1 0 0 0 0 0 0 0\n" >> res.pat ;;
    "b") printf "0 0 0 0 1 0 0 0 0 0 0\n" >> res.pat ;;
    "C") printf "0 0 0 0 0 1 0 0 0 0 0\n" >> res.pat ;;
    "c") printf "0 0 0 0 0 0 1 0 0 0 0\n" >> res.pat ;;
    "D") printf "0 0 0 0 0 0 0 1 0 0 0\n" >> res.pat ;;
    "d") printf "0 0 0 0 0 0 0 0 1 0 0\n" >> res.pat ;;
    "E") printf "0 0 0 0 0 0 0 0 0 1 0\n" >> res.pat ;;
    "e") printf "0 0 0 0 0 0 0 0 0 0 1\n" >> res.pat ;;
    "§") printf "0 0 0 0 0 0 0 0 0 0 0\n" >> res.pat ;;
    esac
    r=$((r+1))
    done
    done < <(echo -e "A=B==a==A=\n=B===Ded=A\nC==D")
    Voilà ce que me donne la sortie dans "res.pat" :
    
    #Input
    0 1 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 0 0 1 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 0 1 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    
    #Input
    1 0 0 0 0 0 0 0 0 0 0
    0 0 0 1 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 0 0 0 0 0 1
    0 0 0 0 0 0 0 0 1 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    
    #Input
    0 0 0 0 0 1 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    ;-))
    0
  4. tibofx Messages postés 14 Statut Membre
     
    ah merci bien pour ta réponse ! Je vais essayer ça ce soir !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tibofx Messages postés 14 Statut Membre
     
    Bon nickel, tout marche parfaitement, j'ai modifié quelques petites choses pour l'adapter à mon application, mais c'était exactement ce que je cherchais ! Vraiment merci ça fait plaisir de se sentir aidé, et chapeau pour tes connaissances en la matière !
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      De rien, mais par contre pourrais-tu poster le script dans son ensemble (si toutefois il n'y a pas d'objection) afin que ça puisse servir à d'autres éventuellement, surtout pour la solution en fonction de ta demande primaire, s'il te plaît ?

      Merci d'avance ;-))
      0