2014-06-19 4 views
1

J'essaie d'imprimer uniquement les lignes contenant la variable $ foo. J'ai essayé d'utiliser des guillemets doubles et des accolades en vain. Quelle est la bonne façon de passer une variable shell à une regex dans sed?Comment passer une variable de bash à regex

sed -n 's:\("${foo}".*$\):\1:p' file.txt 
+0

Etes-vous sûr que votre problème est de passer la variable? Avez-vous vérifié que vous avez une correspondance lorsque vous utilisez la valeur littérale? – merlin2011

+2

Les guillemets simples empêchent la substitution de variable. Vous devez faire quelque chose comme ceci: 'sed -n 's: \ ('" $ {foo} "'. * $ \): \ 1: p' fichier.txt'. Utilisez écho sur cette ligne pour voir (plus ou moins) ce qui se passe. – rici

Répondre

6

sed est surpuissant si vous n'avez pas réellement besoin de modifier les lignes correspondantes. Il suffit d'utiliser grep:

grep "$foo" file.txt 
1

Essayez la commande sed ci-dessous pour imprimer les lignes qui contient la valeur attribuée à la variable foo.

sed -n "/$foo/p" file 
+1

+1 pour corriger la commande sed, -1 pour utiliser le mauvais outil. Vous voyez, personne n'a dit que la variable '' $ foo'' ne contient aucun caractère spécial. Et vous savez ce qui se passe si quelque chose comme ''/'' entre dans '' $ foo''. Il n'y a pas un tel problème avec la solution grep. –

+0

@ Aleks-DanielJakimenko bon point. BUt op veut une solution sed. Donc je l'ai posté. Et aussi si la variable contient des caractères spéciaux, alors pourquoi choisit-il sed pour imprimer les lignes correspondantes. –

+0

C'est pourquoi je n'ai pas downvote :) Mais parfois, les gens demandent de mauvaises choses, et leur donner une réponse ne fait qu'empirer les choses. –

0

Utiliser les guillemets simples que vous obtenez le résultat comme

$-pattern='foo' 
$-sed 's/('$pattern'.*$)/<\1>/g' 
    fo 
    fo 
    foo 
    <foo> 
Questions connexes