Extraire des caractères d'une variable avec des * [Résolu]

Signaler
-
Messages postés
29878
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
9 juin 2021
-
Bonjour,

Je lis un fichier et j'ai des lignes qui commencent par * . Or, je voudrais extraire de ces lignes le premier caractère pour l'analyser.
J'utilise la commande PREM=`expr substr $Z1 1 1`
mais comme Z1 contient des *, j'ai l'erreur :

expr: erreur de syntaxe

Comment je fais pour avoir dans la variable $PREM le premier caractère de chaque ligne ?

Merci

2 réponses

Messages postés
29878
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
9 juin 2021
7 120
Bonjour,

Pour extraire les lignes qui commencent (
^
en expression rationnelle) par le caractère * (
[*]
en expression rationnelle), il suffit de lancer :

grep "^[*]" fichier.txt


Il faudrait nous en dire un peu plus sur le traitement que tu souhaites faire, mais dans ton script tu peux au pire itérer sur les lignes ainsi extraites en injectant le résultat de cette commande
grep
dans une boucle
for
en t'inspirant de la lecture d'un fichier ligne par ligne.

#!/bin/sh

file="fichier.txt"

grep "^[*]" "$file" | while IFS= read -r line; do
    echo "$line"
done 


Bonne chance
Bonjour et merci pour la réponse.

En fait, dans un fichier, je cherchais à repérer les lignes qui commencent par une étoile car la ligne que je veux analyser est juste après. Donc, en gros, je lis ligne après ligne, et lorsque je repère une ligne qui commence par une étoile, je sais que la ligne suivante, je dois l'analyser.

En demandant à gauche à droite, on m'a fourni la solution, et la voici au cas où ça pourrait intéresser d'autres personnes. Il y a surement d'autres solutions, peut être plus efficaces, mais celle ci fonctionne :

Donc, j'ai ce
fichier 
fic1 qui contient, entre autres, les lignes suivantes :
  • blabla bla bla

arg1 arg2 arg3

... et mon script shell a à peu près cette gueule là :

FLAG="0"
while read z1
do
   PREM=$(echo | awk '{ print substr("'"${Z1}"'",1,1)}')
   # echo PREM=$PREM
   if [[ $FLAG = "1" ]] ; then
     FLAG="0"
        ---
        --traitement de la ligne
         ---
   else
     if [[ $PREM = '*' ]] ; then
       FLAG="1"
     fi
  fi
done < fic1


NB : Ce qui ne fonctionnait pas, c'étaient les commandes suivantes :

#PREM=`expr substr $Z1 1 1`
#PREM=${Z1:1:1}


Voilà, et en tous cas, merci pour votre réponse
Messages postés
29878
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
9 juin 2021
7 120
Merci pour ton retour, bonne continuation