Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/07/2013, à 19:08

Kast2

Problème de concaténation des chaines Bash?

Bonjour

Je suis nouveau sur ce forum et je me suis lancé dans la programmation d'un script en bash.
Je précise dès le début: j'ai Ubuntu sur une machine virtuelle sous VirtualBox avec Windows 7 64 bits en host.
Le script que je modifie se situe dans un dossier partagé entre les machines hôte et virtuelle, si bien que je n'arrive pas à enregistrer mon script depuis geany ou gedit  sous Ubuntu (guest). C'est pourquoi je modifie ce script sous Windows avec Notepad++, puis je le lance sous Ubuntu.
Voici le code:

#!/bin/bash
#
#

i=0
while read line
do 
 velTable[$i]="$line"
 i=$((i+1))
done < velocity-Table

## PRELIMINARIES
tardir=results

# input file
REFINFILE=inputdecks/test.in
TEXTE1="D+00 @ Inlet velocity [m/s]"
TEXTE3="  ALAMO = 0.025   Ra = 0.3D-06     BDLT=1"

# iptm take several values (in a for-loop):
for itpm in 1 
#3 61 62 63 64 65 66 67 68
do

TEXTE4="      ITPMO = "${itpm}${TEXTE3}
echo 'TEXTE4: ' $TEXTE4

sed "/${TEXTE3}/s/.*/${TEXTE4}/" ${REFINFILE} > temp1.in

for j in 5 
#`seq 1 ${#velTable[@]}`
do
echo 'itpm : ' $itpm ', vel = ' ${velTable[$j-1]} 

TEXTE2="      vin = ${velTable[$j-1]}"
echo 'TEXTE2: ' $TEXTE2
TEXTE5="${TEXTE2}${TEXTE1}"
echo 'TEXTE5: ' $TEXTE5
echo 'TEXTE5: ' "${TEXTE5}"
TEXTE6="${TEXTE2} string"
echo 'TEXTE6: ' $TEXTE6
echo 'TEXTE6: ' "${TEXTE6}"
sed "/${TEXTE1}/s/.*/${TEXTE2}/" temp1.in > temp.in
echo 'fin'
done
done
exit 0

Remarques:
- le fichier velocity-Table contient lignes de valeurs numériques (1 valeur par ligne), le principe est donc de récupérer ces valeurs dans un tableau
- les fichiers *.in sont des fichiers textes et contiennent les chaînes de caractères TEXTE1 et TEXTE3
Voici ce que j'obtiens dans le terminal:

TEXTE4:  ITPMO = 1 ALAMO = 0.025 Ra = 0.3D-06 BDLT=1
itpm :  1 , vel =  0.5
TEXTE2:  vin = 0.5
D+00 @ Inlet velocity [m/s]
D+00 @ Inlet velocity [m/s]
 string  vin = 0.5
 string        vin = 0.5
fin

Comme on voit, la commande echo affiche un truc bizarre et les chaînes TEXTE5 et TEXTE6 ne sont pas tout à fait ce à quoi on s'attend. Du coup ma 2e commande avec sed ne fonctionne pas du tout, et c'est très embêtant!
Voilà en espérant que quelqu'un ait déjà eu un problème de ce type et/ou avoir éveillé votre curiosité...
Merci d'avance pour vos réponses.

Hors ligne

#2 Le 18/07/2013, à 19:24

nesthib

Re : Problème de concaténation des chaines Bash?

Est-ce que tu peux rendre ton problème un peu plus clair/concret (pour le moment c'est une suite d'echo sans beaucoup de sens).
On dirait que ton script part un peu dans tous les sens, que cherches-tu à faire exactement ?
Est-ce que tu peux donner un exemple clair de fichier d'entrée et de sortie ? Des opérations à effectuer ?

Effectivement il se passe des choses étranges au niveau de TEXTE5 et TEXTE6, mais pour pouvoir reproduire ton problème il faudrait en savoir un peu plus. Si j'essaie la même chose j'obtiens bien :

$ echo $TEXTE5
vin = testD+00 @ Inlet velocity [m/s]
echo $TEXTE6
vin = test string

NB. si ton script est modifié sous windows fais bien attention d'enregistrer en utf-8 et avec seulement « \n » comme séparateur de lignes


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 18/07/2013, à 23:01

Kast2

Re : Problème de concaténation des chaines Bash?

Salut,

Merci pour ta réponse rapide.
En fait le vrai but est de modifier la ligne d'un fichier .in via la commande sed, que j'ai écrite dans mon cas avec le code:

sed "/${chaineMotif}/s/.*/${chaineAInsérer}/" fichier1 > fichier2

Le programme sed va rechercher la "chaineMotif" dans le fichier texte "fichier1" et va remplacer la ligne qui contient ce motif avec la chaîne "chaineAInsérer". Le "fichier1" avec la ligne modifiée sera enregistré dans le "fichier2". En fait tu obtiens ce que je cherche à obtenir...

Comme ça ne marchait pas, j'ai mis ma suite d' "echo" qui résulte de mes recherches, et on constate que les chaines de caractères ne sont pas les bonnes.
J'avais effectivement pensé à l'encodage mais je sais pas vraiment comment tout vérifier.
- Comment fait-on pour être sûr que uniquement "\n" soit bien utilisé comme séparateur de ligne?
- Est-ce que la commande "convertir en UTF-8" de Notepad++ est bien suffisante?
- Dois-je choisir UTF-8 ou UTF8 sans BOM?

Hors ligne

#4 Le 19/07/2013, à 04:03

nesthib

Re : Problème de concaténation des chaines Bash?

Les variables sont remplacées par leur contenu avant exécution de la commande, ce qui signifie que pour le motif « D+00 @ Inlet velocity [m/s] », le « / » va interférer avec ta commande sed :

sed "/${chaineMotif}/s/.*/${chaineAInsérer}/" fichier1 > fichier2

devenant :

sed "/${chaineMotif}/s/.*/D+00 @ Inlet velocity [m/s]/" fichier1 > fichier2

L'utilisation de « / » comme séparateur dans « s/…/…/ » n'est pas obligatoire, tu peux tout à fait utiliser un autre caractère. Je te recommande « s|…|…| ».

Par ailleurs, si tu veux juste remplacer les lignes contenant ton motif par une chaîne arbitraire fixe tu peux utiliser la commande « c » (sed ça n'est pas que la commande « s/…/…/ » tongue)

chaine="D+00 @ Inlet velocity [m/s]"
sed "/$motif1/c\${chaine}" fichier

Et, si jamais motif est susceptible de contenir la chaîne « / », tu peux l'échapper :

chaine="D+00 @ Inlet velocity [m/s]"
sed "/${motif1/\//\\/}/c\${chaine}" fichier
Kast2 a écrit :

- Comment fait-on pour être sûr que uniquement "\n" soit bien utilisé comme séparateur de ligne?

ne pas utiliser windows ? tongue

Kast2 a écrit :

- Est-ce que la commande "convertir en UTF-8" de Notepad++ est bien suffisante?

aucune idée, j'espère que oui en ce qui concerne l'encodage

Kast2 a écrit :

- Dois-je choisir UTF-8 ou UTF8 sans BOM?

sans BOM


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 19/07/2013, à 08:57

Kast2

Re : Problème de concaténation des chaines Bash?

Merci pour les précisions wink
Il s'agit effectivement d'un problème d'encodage des caractères de fin de ligne, mais celui du fichier velocity-Table qui comprenait des "CR+LF" à la place de "LF" utilisés sous linux. La commande "echo" tente en fait d'afficher une chaîne de plusieurs lignes sur une seule ligne, d'où le problème...

Voilà une bonne leçon, toujours faire attention à ces fins de lignes et pas seulement dans le script !
Bonne journée!

Hors ligne