Seulement les lignes entres 2 expressions ( Avec / )
Bonjour à tous,
Mon problème n'en ai plus vraiment un puisque j'ai trouvé une solution subsidiaire. Mais il me reste quelques interrogations à éclaircir sur la command sed.
Voila l'histoire. J'ai un fichier trié contenant une URL par ligne. Je souhaite récupérer les URL entre l'URL $1 et $2. $1 et $2 sont fournies par l'utilisateur et contiennent le caractère "/" puisque ce sont des URLs.
La commande sed '/$1/,/$2/p' permet de faire ça très bien... Sauf qu'il y a les "/". Et sous cette forme de sed je n'ai pas réussi à utiliser un autre caractère que "/" dans la commande ( sed '_$1_,_$2_p' ne marche pas ) Le pourquoi du comment, si vous avez la réponse?
Donc L'autre solution est de modifier les "/" de $1 et $2 par des "\/"
Puis d'appliquer notre sed '/$1/,/$2/p'. Mais ça fait un peu moche je trouve :aie: ( Et étrangement ça ne fonctionne plus dans mon petit script cf plus bas )
Ou alors avec un awk un peu long... mais la aussi pourquoi utiliser awk alors qu'une command sed existe déjà :?
Avez vous déjà été confronté à cette situation? Comment utiliser la commande sed avec des "/" sous cette forme? Y a t'il plus simple?
Un petit script qui illustre le problème :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #!/bin/bash
data=`echo -e "t/1
t/2
t/3
t/4
t/5
t/6
t/7"`
echo "$data"
echo -e "sed between t/3 and t/5 without var ( t\/3 & t\/5)"
echo "$data" | sed -n '/t\/3/,/t\/5/p'
t3="t/3"
t5="t/5"
echo -e "sed between $t3 and $t5 with original var"
echo "$data" | sed -n "/$t3/,/$t5/p"
echo "sed between $t3 and $t5 with temp var ( replace / by \/ )"
e3=`echo "$t3" | sed -e 's_/_\\\/_g'`
e5=`echo "$t5" | sed -e 's_/_\\\/_g'`
echo "temp var : $e3"
echo "temp var : $e5"
echo "$data" | sed -n -e "/$e3/,/$e5/p"
echo -e "awk between $t3 and $t5 with var"
echo "$data" | awk -v t3=${t3} -v t5=${t5} -v show="" '$0==t3 {show++} show {print} $0==t5 {show=""}' |
En vous remerciant.
ps : Je débute en shell, si vous avez d'autres remarques n'hésitez pas.