Rechercher : dans
Par :

[shell] fin de ligne

Dernière réponse le 23 jan 2008 à 10:55:38 tibofx, le 22 jan 2008 à 19:50:10 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [shell] fin de ligne » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier Voir Supprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Guide d'utilisation du Shell pour débutant VoirSHELL BASH - GUIDE D'UTILISATION - Niveau Débutant Introduction Appel aux membres CCM II. C'est quoi le shell ? III. Comment accéder à la ligne de commande IV. Les consoles virtuelles Exemple : Accéder à la console 3 depuis l'interface...
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...

1

jipicy, le 22 jan 2008 à 19:59:08

Salut,

T'as pas un exemple concret (avant => après) s'il te plaît, ainsi qu'un aperçu de ton script... merci ;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

tibofx, le 22 jan 2008 à 20:10:08

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 ??

Répondre à tibofx

3

jipicy, le 22 jan 2008 à 21:38:33

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
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

4

tibofx, le 22 jan 2008 à 22:48:59

Ah merci bien pour ta réponse ! Je vais essayer ça ce soir !

Répondre à tibofx

5

tibofx, le 23 jan 2008 à 00:58:07

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 !

Répondre à tibofx

6

 jipicy, le 23 jan 2008 à 10:55:38

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 ;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy
Collection CommentÇaMarche.net