2013-01-05 4 views
2

J'essaie d'utiliser sed pour trouver le numéro de ligne d'une chaîne dans un fichier texte. Le code suivant fonctionne parfaitement. Le problème que j'ai est lorsque j'essaie de limiter la recherche à une gamme de numéros de ligne. Dans l'exemple ci-dessous, j'essaie de le limiter aux lignes 5 à 10. Disons que "asdf" existe à la ligne 7. Je ne reçois aucune valeur définie sur variable2.Sed pour trouver le numéro de ligne limité à une gamme de numéros de ligne

variable2=$(sed -n '5,10 /asdf/ =' $file); 

Quelqu'un peut-il m'aider?

Répondre

3

Voilà comment avec awk:

$ cat file 
qwer 
asdf 
zxcv 
qwer 
asdf 
zxcv 
qwer 
asdf 
zxcv 

$ awk '/asdf/ && NR>=5 && NR<=10 {print NR}' file 
5 
8 

Si vous voulez arrêter après le premier match juste exit le script et utiliser la substitution de commande pour stocker la valeur dans une variable:

$ awk '/asdf/ && NR>=5 && NR<=10 {print NR; exit}' file 
5 

$ var=$(awk '/asdf/ && NR>=5 && NR<=10 {print NR; exit}' file) 

$ echo $var 
5 
+0

Pouvez-vous développer Comment puis-je mettre le premier résultat (5 dans votre exemple) dans une variable? ? – rmkilc

+0

@rmkilc voir édition –

+0

Vous pouvez mettre toutes les conditions en dehors du bloc d'action: 'awk '5 <= NR && NR <= 10 &&/asdf/{print NR}'' –

3

votre sed la ligne est très proche. voir ci-dessous (emprunté exemple d'entrée de sudo_O:

kent$ echo "qwer 
asdf 
zxcv 
qwer 
asdf 
zxcv 
qwer 
asdf 
zxcv"| sed -n '5,10 {/asdf/=}' 
5 
8 
+0

Merci Le support bouclé a fait l'affaire. – rmkilc

0

Voici ce qui a fonctionné pour moi:

variable2=$(sed -n '5,10 {/asdf/=}' $file); 
Questions connexes