#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,
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 ! ![]()
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. ![]()
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 UNcut -d"5" -f1 $fichier > $fichier3 (avant le chiffre 5) pourquoi avant?
unun 1234
deuxdeux 1234
troistrois 1234
quatrequatre 1234
cinqcinq UN DEUX
sixsix UNcut -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 UNcut -d"5" -f3 $fichier > $fichier3 (je ne comprends pas)
cinqcinq UN DEUX
sixsix UNNB
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";" -f1Derniè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";" -f1que 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"
fiNB
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éroet
il faut toujours mettre les Développements de paramètres entre guillemets ! TOUJOURS!!!
![]()
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éroje 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. ![]()
admettons :
var=abc
begin=${var::7}
echo ${#begin}
3
nbChars=${#begin}
(( nbChars == 0 )); echo $?
1 #faux
(( nbChars == 3 )); echo $?
0 #vraiDerniè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 userspaceje 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.concaton 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
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
fiHors 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"
fiMerci
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 ![]()
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
Bonsoir et merci Jean-Marie
JM comme Jean-Marie
Ah..., je pensais que c'était Joseph-Maurice.
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
