Extraire des caractères d'une variable avec des *

Résolu
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

  1. Modérateur
    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
    1. 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
      1. Modérateur
        Merci pour ton retour, bonne continuation