[Shell] : string contenue dans une autre

Résolu/Fermé
Thorfin - 10 févr. 2012 à 16:28
 Thorfin - 14 févr. 2012 à 15:54
Bonjour,

Je cherche à déterminer si une chaîne de caractères est contenue dans une autre.
J'ai fait le script suivant :

#!/bin/bash
chaine1='Mystring'
chaine2='My'
if [[ "$chaine1" == *"$chaine2"* ]]
then
echo "It's there!";
fi

Ce petit programme a l'air de fonctionner MAIS je souhaiterai y faire appel de la façon suivante :
/home/program.sh home/file1 home/file2 home/file3
"file1" est un fichier contenant uniquement "Mystring"
"file2" est un fichier contenant uniquement "My"
et "file3" est le fichier dans lequel écrire "It's there!"

Comment faire pour lire les chaînes de caractères des fichiers, effectuer le test et renvoyer la réponse dans un fichier ?

Toute aide est la bienvenue

P.S. : je suis débutant en shell, je ne maîtrise absolument pas ce langage.
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 févr. 2012 à 18:12
$ ls
file1  file2  foo.sh*

$ cat file1
Mystring

$ cat file2
My

$ cat foo.sh 
#!/bin/bash

grep -q -f $2 $1
if [[ $? = 0 ]]
then
echo "It's there!" > $3
fi

$ ./foo.sh file1 file2 file3

$ ls
file1  file2  file3  foo.sh*

$ cat file3
It's there!

$ 

;-))
1
J'essaierai ça le semaine pro, d'ici là merci à toi :-)
0
J'ai un problème : le test est négatif quelques soit les cas de figure.
File1 contient : Mystring
File2 contient : My
File3 contient : 0 !!!!
Par contre j'ai modifié légèrement le script foo.sh pour rajouter un else :

#!bin/bash

grep -q -f $2 $1
if [[ $? = 0 ]]
then
echo "1" > $3
else
echo "0" > $3
fi
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
14 févr. 2012 à 13:11
Ben chez moi, pas de soucis :

$ ls
file1  file2  foo.sh*

$ cat file1
Mystring

$ cat file2
My

$ cat foo.sh 
#!/bin/bash

grep -q -f $2 $1
if [[ $? = 0 ]]
then
echo "It's there!" > $3
else
echo "Bad!" > $3
fi

$ ./foo.sh file1 file2 file3

$ ls
file1  file2  file3  foo.sh*

$ cat file3
It's there!

$ echo "toto" > file2

$ cat file2
toto

$ ./foo.sh file1 file2 file3

$ cat file3
Bad!

$

:-))
0
J'exécute les commandes dans un terminal via un logiciel, je ne vois donc pas ce qu'il se passe (je constate juste). J'ai essayé d'entrer les commande dans un terminal, quand j'entre ./foo.sh file1 file2 file3
il me retourne :
grep: illegal option -- q
grep: illegal option -- f
Usage: grep -hblcnsviw pattern file . . .
Alors qu'initialement on a les mêmes fichiers ! le nom diffère, en fait, j'envoie très exactement la commande :
./contains.sh Temporary_string_83724.Script Temporary_stringSearch_83724.Script Temporary_stringSearchResult_83724.Script

Il ne s'agit pas d'un problème de version bash, bourne, c ? (je m'y connais pas du tout)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
14 févr. 2012 à 14:11
Sur quel système es-tu ?
0
Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
10 févr. 2012 à 16:41
Bonjour,

Connaissez-vous la commande diff ?

--
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 févr. 2012 à 16:45
Salut,

Pourquoi elle est sensée répondre à ses attentes ?
La commande "diff" compare le contenu de 2 fichiers (ou répertoires), mais en aucun cas ne peut déterminer si le contenu d'un fichier est présent dans l'autre ;-(
0
Non je ne connais pas la commande diff mais d'après ce que dit zipe31 elle me serait inutile. Donc je ne sais pas si il faut que je cherche dans cette direction?!
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
10 févr. 2012 à 17:17
C'est dans quel but ce script ?
0
En fait je travaille en radiothérapie et on utilise un logiciel de planification de traitement (Pinnacle) permettant d'automatiser pas mal d'étape à l'aide de script (le code est propre au logiciel et basé sur du c++). Je voudrais détruire un objet si son nom contient les caractères "eq" mais c'est impossible à faire avec le code du logiciel. Il faut donc que j'envoie les actions à effectuer dans un terminal, que j'effectue les opérations en shell et que je récupère le résultat dans le script Pinnacle. Je sais envoyer les deux chaînes de caractères d'intérêt dans deux fichiers distincts (ou dans un mais ça à l'air plus compliqué à exploiter ?!) et je sais lire le fichier dans lequel sera stocké le résultat. Mais entre ces deux opération, tout ce qui est du shell, je ne vois pas comment m'en sortir ...
(je ne sais pas si je suis très clair, je peux détailler certains points si ça peut aider)
0
Géca Messages postés 799 Date d'inscription samedi 29 novembre 2003 Statut Contributeur Dernière intervention 29 juin 2015 106
10 févr. 2012 à 18:24
Désolé effectivement la commande diff n'aide en aucune manière dans le cas proposé.
0