Recuperer le premier element d'une chaine

Résolu/Fermé
seb75 Messages postés 20 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 25 mars 2008 - 2 mars 2008 à 13:34
seb75 Messages postés 20 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 25 mars 2008 - 2 mars 2008 à 13:57
Bonjour,

je souhaite récupérer le premier élément de chaque ligne d'un texte (fichier3.txt) qui sera "<" ou ">" et d'ecrire ensuite les lignes commencant par "<" dans un fichier4.txt et celles commencant par ">" dans un fichier5.txt, mais je n'y arrive pas.
J'ai pensé à plusieurs solutions mais en vain. Voici ma dernière idée :

while read line
do
$n = substr($line,0,1)
if [$n = "<" ]
then
(echo -e "$line\n") >> fichier4.txt
else
(echo -e "$line\n") >> fichier5.txt
fi
done < fichier3.txt

mon fichier3.txt etant :
1,3c1,6
< <root name="application">
< <configuration name="prod" context="run">
< <backup oneline="true">
---
> <root
> name="application">
> <configuration name="prod"
> context="run">
> <backup
> oneline="false">

Merci de votre aide car je commence un peu à me démoraliser....

4 réponses

EminoMeneko Messages postés 2435 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 23 mai 2018 318
2 mars 2008 à 13:48
Ton algorithme semble juste mais j'utilise assez peu read. Ce que j'ai à l'esprit c'est que en shell script quand on lit une valeur on précède la variable de $ or après read il n'y en a pas dans ton code.
Je ne sais pas si la syntaxe de read est telle que tu ne dois pas mettre de $ devant un nom de variable mais ce $ est une généralité en Shell Script. Essai donc ça.

Je ne maitrise pas trop les boucles comme tu le fait mais il me semble avoir lu mes fichiers autrement avec ce type de boucles et la redirection était en première ligne plutôt qu'à la fin.

Il existe plusieurs manière de lire un fichier ligne par ligne je te colle des petits codes issues de mon rapport.
cat < /etc/passwd | while true
do
	read ligne
	if [ "$ligne" = "" ]
	then
		break
	fi
	echo "$ligne"
done


function display
{
	while :
	do
		read ligne
		if [ -z "$ligne" ]
		then
			break
		fi
		echo $ligne
	done
}
display < $1


Voilà en espérant que ça aide. :)

PS : En ressortant mes codes on voit qu'il n'y a pas de $ donc ça n'est pas une erreur de ta part mais j'en était plus sûr et je m'en souvenait plus de tout ça. :P
Ah oui et pense à adapter les codes selon tes besoins bien sûr. Moi mon TP c'était de lire le fichier /etc/passwd mais tu peut remplacer par ce qui t'intéresse.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 mars 2008 à 13:53
Salut,
#! /bin/bash

while read ligne
do
if [ "${ligne::1}" = "<" ]
then
echo ${ligne} >> fichier1.txt
elif
[ "${ligne::1}" = ">" ]
then
echo ${ligne} >> fichier2.txt
fi
done < fichier3.txt
;-))
0
seb75 Messages postés 20 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 25 mars 2008
2 mars 2008 à 13:53
merci de ton idée, mais ça ne marche pas.
Je ne pense pas que cela vienne du $, car l'ecriture s'effectue bien, mais tout s'écrit dans le fichier5.txt car la condition di if n'est pas vérifiée.
0
seb75 Messages postés 20 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 25 mars 2008
2 mars 2008 à 13:57
Merci beaucoup jipicy, ca marche niquel !!
Merci à vous deux pour la rapidité de vos réponses ;-)
0