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 08/04/2026, à 12:22

JM3863

Rechercher la position d'une chaine de caractères dans un champ

Bonjour
je recherche l'instruction qui permet de trouver la position d'une chaine de caractères dans un champ
exemple
mon_champ = "ABCDEFGHIJKLMNOPQRSTUVWWXYZ"

la chaine "MNOP " se trouve en position 13 ou 14 si le premier caractère A est à 0
Find,grep, awk sed font des recherches sur des fichiers et non sur un champ , à moins 'avoir mal compris
il me semblait qu'il existait l'équivalent d'une commande SEARCH associée à MID

Merci
JM

Hors ligne

#2 Le 08/04/2026, à 12:58

diesel

Re : Rechercher la position d'une chaine de caractères dans un champ

jean-marie@jean-marie:~$ mon_champ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
jean-marie@jean-marie:~$ recherche="MNOP"
jean-marie@jean-marie:~$ debut="${mon_champ%%${recherche}*}"
jean-marie@jean-marie:~$ position=$((${#debut}+1))
jean-marie@jean-marie:~$ echo $position
13
jean-marie@jean-marie:~$

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 08/04/2026, à 13:01)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#3 Le 08/04/2026, à 13:10

nany

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonjour,



JM3863 a écrit :

Find,grep, awk sed font des recherches sur des fichiers et non sur un champ , à moins 'avoir mal compris

Eh bien tu as mal compris.
OK pour find qui fait des recherches dans un répertoire.
Mais pour grep, awk et sed, on peut leur donner en entrée autre chose que le contenu d’un fichier.

Un exemple avec awk qui possède une fonction index correspondant à ton problème :

~$ mon_champ="ABCDEFGHIJKLMNOPQRSTUVWWXYZ"

~$ echo "$mon_champ" | awk '{print index($0,"MNOP")}'
13

~$

Mais tu recherches probablement expr index :

~$ expr index "$mon_champ" "MNOP"
13

~$

Sinon, il y a aussi la solution de diesel qui consiste à décomposer la chaîne et faire un calcul (un peu plus long, donc).

Hors ligne

#4 Le 08/04/2026, à 15:33

MicP

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonjour

Je propose cette ligne de comandes bash :

[[ $mon_champ =~ (.*)$recherche ]] && echo $(( ${#BASH_REMATCH[1]} + 1 ))

Cette ligne de commandes retournera la position de recherche dans mon_champ (et un code d'erreur à zéro => indiquant que tout s'est bien passé)
ou bien retournera un code d'erreur à 1 si recherche n'a pas été trouvé dans mon_champ

C'est la même chose que ce qui a été proposé par diesel
mais avec en plus la possibilité de tester un code d'erreur qui permettrait de savoir si recherche a bien été trouvé dans mon_champ.

Dernière modification par MicP (Le 08/04/2026, à 16:14)

Hors ligne

#5 Le 08/04/2026, à 16:49

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

Eh bien tu as mal compris.

tout à fait, nany ! wink
cependant, awk est surdimensionné pour traiter une chaîne.

je ne départagerais pas diesel et MicP : il y a une solution POSIX, et une solution full bash. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 09/04/2026, à 11:24

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonjour à Tous
Merci infiniment pour vos réponses
Vous êtes vraiment très calés!!
J'ai fait 42 ans d'info avec les langages IBM JCL,et Cobol, VB,Assembleur etc.. et je me un peu décontenancé
On retrouve ici, toute la puissance des commandes et leur précision infinie
j'étudie  actuellement le cut et j'avoue ne pas toujours saisir ce qu'il se passe
je vous donne mon cas (c'est encore purement intellectuel, j'essaie de "dominer" les commandes pour "m'amuser' "   (je suis à la retraite)

mon fichier   (et quelques tests)

unun 123456   TOTO  TITI
deuxdeux 123456  TRUC TROC TRAC
troistrois 123456 Un DEUX TROIS QUATRE 
quatrequatre 123456  UN DEUXTROIS QUATRE CINQ SIX 
cinqcinq  UN DEUX
sixsix  UN

cut -d"5" -f1  $fichier > $fichier3   (avant le chiffre 5)   pourquoi avant?

unun 1234
deuxdeux 1234
troistrois 1234
quatrequatre 1234
cinqcinq  UN DEUX
sixsix  UN

cut -d"5" -f2  $fichier > $fichier3  (après le chiffre 5) pourquoi j'affiche plus que 2 champs

6   TOTO  TITI
6  TRUC TROC TRAC
6 Un DEUX TROIS QUATRE 
6  UN DEUXTROIS QUATRE CINQ SIX 
cinqcinq  UN DEUX
sixsix  UN

cut -d"5" -f3  $fichier > $fichier3  (je ne comprends pas)

cinqcinq  UN DEUX
sixsix  UN

NB
je m'appuie sur
Voici la liste des options disponible pour la commande cut :

Options    Description
-f (- champs)    Spécifiez les champs que vous souhaitez extraire.
-c (- caractères)    Spécifiez les caractères que vous souhaitez extraire.
-b (- octets)    Fournissez les octets que vous souhaitez extraire.
-d (-Délimiteur)    Ici, vous spécifiez le délimiteur que vous souhaitez utiliser avec la commande CUT.

qu'est-ce qu'ils appellent un champ?

Merci beaucoup
JM
PS
c'est ce post ici qui m'avait conduit vers la commande cut  (cut -d: -f2 toto.txt | cut -d";" -f1)
https://forum.ubuntu-fr.org/viewtopic.php?id=2043464
Par exemple

kldfj djf q name:toto;class...
kldfj djf q name:tata;class...
kldfj djf q name:tutu;class...

et je voudrais récupérer en sortie

toto
tata
tutu
***********
cut -d: -f2 toto.txt | cut -d";" -f1

Dernière modification par xubu1957 (Le 09/04/2026, à 11:33)

Hors ligne

#7 Le 09/04/2026, à 11:28

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

kldfj djf q name:toto;class...
kldfj djf q name:tata;class...
kldfj djf q name:tutu;class...

et je voudrais récupérer en sortie

toto
tata
tutu
***********
cut -d: -f2 toto.txt | cut -d";" -f1

que vient faire toto.txt ? est-ce en rapport avec le mot toto dans " kldfj djf q name:toto;class..."?

modération: rajout des balises code, par respect pour les aidants et les règles du forum !

Dernière modification par xubu1957 (Le 09/04/2026, à 11:35)

Hors ligne

#8 Le 09/04/2026, à 13:04

diesel

Re : Rechercher la position d'une chaine de caractères dans un champ

Un champ pour la commande cut, c'est tout ce qu'il y a entre le début d'une ligne et un délimiteur (non compris) ou entre deux délimiteurs (non compris) ou entre un délimiteur (non compris) et la fin de la ligne.
-f1, c'est le champ entre le début de la ligne et le premier délimiteur,
-f2, c'est le champ entre le premier délimiteur (s'il existe) et le deuxième ou la fin de la ligne s'il n'y a qu'une seule occurrence du délimiteur dans la ligne,
-f3, c'est le champ entre le deuxième...

Pour le deuxième post, toto.txt, c'est le nom du fichier qui contient le texte sur lequel tu veux faire un cut (puis un autre).

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 09/04/2026, à 13:04)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#9 Le 09/04/2026, à 17:24

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Merci
j'ai une question encore plus bête
je n'arrive pas à tester correctement le contenu d'une variable alphanumérique
j'ai une variable $Startup
j'ai testé sa longueur (elle fait 7,et elle contient "Startup"), je suis passé par là pour voir s'il s'agissait de longueur (espace), c'est pas un problème de majuscule?
****une partie de mon programme

length=${#Startup}
 notify-send "The length of the string is: $length"
if [ $sum1 -gt 1 ]
then
   notify-send "SuperieurA1=$bonjour  $sum1"
sum1=0
else
    notify-send " Pas Sup1=$bonjour  $sum1"
fi
if [ $Startup -eq "Startup" ]
then   
 echo $Duree|tee -a $fichier3
   notify-send "StartupStartupJECRIS $Startup"
else
    notify-send "Startup diff de Startup  $Startup"
fi

NB
pour le if
j'ai tout essayé ou presque

if [ $Startup -eq "Startup" ]
if [ $Startup = "Startup" ]
if [ $Startup = 'Startup' ]
if [ $Startup = Startup ]
if  $Startup = "Startup" 
if  $Startup = 'Startup'
if #Startup = "Startup"  
if  {#Startup} = "Startup"  

on passe toujours par la branche différent de "Startup"
ça doit être une évidence pour vous ,mais je bloque
l'autre test marche (>1)

modération: rajout des balises code une fois de plus, ou une fois de trop !

Dernière modification par xubu1957 (Le 09/04/2026, à 17:31)

Hors ligne

#10 Le 09/04/2026, à 17:29

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

pour Jean-Marie
Pour le deuxième post, toto.txt, c'est le nom du fichier qui contient le texte sur lequel tu veux faire un cut (puis un autre)

AH le fameux toto détesté des utilisateurs et si prisé par les informaticiens sans imagination que nous sommes ou que nous étions !!!

Hors ligne

#11 Le 09/04/2026, à 18:40

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

si $startup est un chaîne, alors dans un contexte arithmétique elle vaut 0

var=abcdef
(( var == 0 )); echo $? #il n'y a pas de dollar, ce n'est pas une erreur.
0 #vrai : $var vaut zéro
(( ${#var} == 0 )); echo $?
1 #faux : la longueur de $var ne vaut pas zéro

et

il faut toujours mettre les Développements de paramètres entre guillemets ! TOUJOURS!!!

wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 09/04/2026, à 20:31

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

bonsoir

var=abcdef
(( var == 0 )); echo $? #il n'y a pas de dollar, ce n'est pas une erreur.
0 #vrai : $var vaut zéro
(( ${#var} == 0 )); echo $?
1 #faux : la longueur de $var ne vaut pas zéro

je n'ai rien compris
dans var il y a abcdef  donc ${#var}  = 6 ?
(( var == 0 ))  vous mettez 0 dans la variable ?
pour ma part

dans le nom de variable startup il y a la valeur "Startup" ou pas , c'est pourquoi je teste le contenu de la variable startup
elle a été créée ainsi :  Startup=${ligne:0:7}
quand je l'affiche
notify-send "Startup=$Startup "  j'ai bien Startup=Startup    quand j'ai Startup
notify-send "Startup=$Startup "  j'ai bien Startup=tartempion    si j'ai tartempion dans la variable
alors comment tester?

pour l'addition j'ai dû passer par
sum2=$((sum2 + 1))
pour ajouter 1 à sum2  (je faisais   naivement $sum2=$sum2+1
on alimente une variable sans $
toto="abcd" et quand on l'utilise en entrée on l'évoque avec $ (if $toto=  etc...)
c'est toute une série d'éléments à bien maîtriser, cela en fait son extrême richesse ....et difficulté

j'écris un programme pour extraire une partie des enregistrements (un enregistrement sur 3 et qui contient la chaine "Startup"
il est certain qu'une seule commande peut le faire mais je voudrais le faire en balayant séquentiellement le fichier et en analysant les enregistrements un à un
c'est aussi pour me familiariser avec les commandes dans un but purement ludique et éducatif
Je vous remercie pour votre aide et peux comprendre que vous laissiez tomber
JM

Hors ligne

#13 Le 09/04/2026, à 20:40

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

dans une évaluation arithmétique (entre double parenthèses), == n'est pas une assignation, c'est un test.

comment tester quoi ?
sois précis, à chaque fois, tout le temps. wink

admettons :

var=abc
begin=${var::7}
echo ${#begin}
3
nbChars=${#begin}
(( nbChars == 0 )); echo $?
1 #faux
(( nbChars == 3 )); echo $?
0 #vrai

Dernière modification par Watael (Le 09/04/2026, à 20:41)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 09/04/2026, à 21:06

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

j'ai compris votre message ,je l'ai testé en console
je voudrais tester le contenu de la variable Startup, il me semble que c'est clair

j'ai des enregistrements  comme suit:

samedi 6 mars 2021, 11:20:10 (UTC+0100)
Startup finished in 10.248s (kernel) + 24.062s (userspace) = 34.311s
graphical.target reached after 24.041s in userspace
ven. 12 mars 2021 10:10:32 CET
Startup finished in 8.292s (kernel) + 58.505s (userspace) = 1min 6.798s
graphical.target reached after 44.782s in userspace
mar. 27 avril 2021 09:02:39 CEST
Startup finished in 8.106s (kernel) + 59.034s (userspace) = 1min 7.141s
graphical.target reached after 46.256s in userspace
lun. 15 août 2022 08:26:33 CEST
Startup finished in 7.781s (kernel) + 59.360s (userspace) = 1min 7.141s
graphical.target reached after 45.183s in userspace
mar. 16 août 2022 07:26:06 CEST
Startup finished in 7.577s (kernel) + 57.877s (userspace) = 1min 5.455s
graphical.target reached after 43.760s in userspace

je veux sélectionner ceux qui commencent pas Startup  et extraire une partie de cette enregistrement pour le concatener dans un fichier
Encore une fois, je ne veux pas la commande synthétique ,je veux procéder avec une lecture séquentielle et avec des tests (c'est pour apprendre à manipuler)

modération: balises code appliquées seulement aux retours techniques

Dernière modification par xubu1957 (Le 10/04/2026, à 07:51)

Hors ligne

#15 Le 09/04/2026, à 21:22

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

#!/bin/bash

while read line
do
    if [[ $line =~ ^Startup ]]
    then
        : extraction. Selon quel(s) autre(s) critère(s) ? ...
        echo "$extraction"
    fi
done <tonFichier >>fichier.concat

on a déjà vu comment lire un fichier.

NB: le contenu des fichiers aussi doit être entre balises CODE, pour que l'éventuel formatage soit visible.

Dernière modification par Watael (Le 09/04/2026, à 21:23)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 09/04/2026, à 21:25

xubu1957

Re : Rechercher la position d'une chaine de caractères dans un champ

Pour ajouter toi-même les balises code à ton message #14 :

  • Cliquer sur  le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

moko138 a écrit :

1) Les balises-code sont les < > (crochets bleus) de la barre de mise en forme.

Balisesmoko138.jpg
_ _ _

3) /!\  Si vous avez plusieurs retours à donner, séparez-les bien (toujours pour la lisibilité) :

comme
cela.

Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [ Résolu ] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

Hors ligne

#17 Le 09/04/2026, à 23:19

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonsoir
ça ne répond pas à ma question
Comment tester une variable
en français

si le contenu de ma variable est égale à "abcdef"
alors
je fais ceci
sinon
je fais cela

ma variable est $Startup
quand  j'affiche la donnée  j'ai "Startup" , ou "graphic"  ou "samedi"  évidemment sans les guillements
  ce qui explique  la raison de mon test
et quelle que soit ma façon de procéder , j'ai comme réponse, ne contient pas Startup ==>le message "Startup diff de Startup Startup"

mon codage :

length=${#Startup}
 notify-send "The length of the string is: $length"

if [ $sum1 -gt 1 ]
then
   notify-send "SuperieurA1=$bonjour  $sum1"
sum1=0
else
    notify-send " Pas Sup1=$bonjour  $sum1"
fi
if  {#Startup} = "Startup" 
then   
 echo $Duree|tee -a $fichier3
   notify-send "StartupStartupJECRIS $Startup"
else
    notify-send "Startup diff de Startup  $Startup"
echo $Duree|tee -a $fichier3
fi

Hors ligne

#18 Le 09/04/2026, à 23:34

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

if  {#Startup} = "Startup" 

coquille ? il manque la commande test, et le dollar de la variable.

la longueur de la variable (${#nomVar}), qui est un entier, ne vaudra jamais Startup.
le code que j'ai indiqué teste que la chaîne lue depuis le fichier commence par Startup.
Si tu veux exécuter d'autres actions pour les lignes graphic..., jjj. ... (où jjj sont les trois premières lettres du jour; c'est ce qu'on voit sur l'extrait du fichier présenté), tu peux passer par un case...esac

la manipulation de la position dans une chaîne pour tester le début de cette chaîne n'est pas une bonne idée.

Dernière modification par Watael (Le 09/04/2026, à 23:37)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#19 Le 10/04/2026, à 16:09

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonjour
Bingo
Après toute une série de tests , y compris en testant le différent  (!=) je me suis aperçu que je passais toujours par la branche else de mon IF
j'ai même  essayé avec d'autres champs

motif=Startup
Entree=${Startup::7}
notify-send  "motif= $motif"
notify-send  "Entree= $Entree"
if [[$Entree =~ $motif ]
if [[$Entree = $motif ]

ça ne marchait pas (j'allais toujours exécuter le else
j'ai vu que sur la ligne de mon if  les [ et ] n'étaient pas en rouge
j'ai fait un copier coller d'une autre ligne de test (avec les crochets en rouge) celle-ci if [ $sum1 -gt 1 ]
et tout a marché
voici mon code du If (comme je l'avais écrit au départ)

if [ $Startup = "Startup" ]
then   
 echo $Duree|tee -a $fichier3
   notify-send "StartupStartupJECRIS $Startup"
else
    notify-send "Startup diffYesEntree de Startup$Startup"
fi

Merci
JM

Hors ligne

#20 Le 10/04/2026, à 17:41

diesel

Re : Rechercher la position d'une chaine de caractères dans un champ

en bash, les tests avec les crochets (simples ou doubles) réclament obligatoirement au moins un espace avant ET au moins un espace après (sauf si fin de ligne).

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#21 Le 10/04/2026, à 19:25

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonsoir et merci Jean-Marie
JM comme Jean-Marie

Hors ligne

#22 Le 10/04/2026, à 19:47

Watael

Re : Rechercher la position d'une chaine de caractères dans un champ

[ et [[ sont des commandes, et pour être identifiées, comme n'importe quelle autre commande, en effet, elles doivent être cernées d'espaces.
par exemple, on peut écrire for i do : stuff with $i; done (on itère tous les arguments "sur" i)
mais pas forido:stuff with $i; done wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#23 Le 10/04/2026, à 20:55

MicP

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonjour JM3863

Pour le shell bash, ce lien pourrait t'aider : Introduction à la programmation en Bash (par Eric Sanchis)

Cordialement.

Hors ligne

#24 Le 10/04/2026, à 21:40

diesel

Re : Rechercher la position d'une chaine de caractères dans un champ

JM3863 a écrit :

Bonsoir et merci Jean-Marie
JM comme Jean-Marie

Ah..., je pensais que c'était Joseph-Maurice. lol

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#25 Le 10/04/2026, à 23:01

JM3863

Re : Rechercher la position d'une chaine de caractères dans un champ

Bonsoir Micp
je jetterai un oeil voire 2, car il y a pas mal à apprendre sur le langage concis et strict  entre les parenthèses,crochets,guillemets,dollar, dièse point-virgules....imbrications, ordre également très important !!!

[ et [[ sont des commandes, 

en mettre une ou deux a de l'importance !!
A suivre
bonne nuit
JM

Hors ligne