BASH: comment mettre de la variable à l'intérieur de regex?
je suis d'essayer de faire fonctionner le code suivant:
searchfile="availables.txt"
read searchterm
grep_params="-i ^.*${searchterm}.*;.*$' $searchfile"
egrep $grep_params
qui devrait résonner toutes les lignes commençant par l' $searchterm et suivi par un ";". Mais si le searchterm contient des espaces, il ne fonctionne pas (par exemple: "black eyed peas"), il me donne le résultat suivant:
egrep: eyed: No such file or directory
egrep: peas.*;.*$": No such file or directory
egrep: "availables.txt": No such file or directory
- <a href="mywiki.wooledge.org/BashFAQ/050">BASH entrée de la FAQ n ° 50: "je suis en train de mettre une commande dans une variable, mais les cas complexes sont toujours voués à l'échec!"</a>
Vous devez vous connecter pour publier un commentaire.
Juste Bash
Vous avez besoin de contrôler, de couper un mot ici. Ce qui est fait par le biais de réseaux. Voir http://mywiki.wooledge.org/WordSplitting
Mais ne pas utiliser de
egrep
- utilisationgrep -E
au lieu de cela, puisque la première est obsolète.Mais j'aurais changé votre code comme ça:
.*
lors de la demande desearchterm
?.*$
dans le grep_params, alors il répondra à toutes les ";"Le code que vous recherchez est quelque chose comme:
Remarque que j'ai simplifié votre regex (j'espère que j'ai bien compris!).
Cependant, comme Ignacio Vazquez-Abrar a noté, cela ne fonctionne pas dans les cas complexes.
Comme c'est s regex, essayez de remplacer le "" avec
\s
. Ceci représente un caractère d'espacement."noire\seyed\speas"
Alternative consiste à transmettre les params par xargs:
Je suis arrivé ici en cherchant "bash variable dans une expression rationnelle"
Je l'ai résolu en changeant la regex délimiteurs de "/" à "+"
Même si elle n'a rien à voir avec egrep, je vais ajouter ma solution pour d'autres personnes qui arrivent de recherches similaires:
Et oui, je vois maintenant qu'il avait peu à voir avec bash et tout à voir avec les barres obliques dans le fichier journal de la variable. Oh pinaise!