Tu parles de "sed". Est-ce que t'est obligé d'utiliser cet outil alors qu'il y en a d'autres plus ou moins adaptés à ton besoin ?
Le problème de sed et des autres outils standards de traitement de fichiers, c'est qu'ils considèrent le texte comme du texte. Ils ne voient pas la notion d'intervalle. Pire, entre 1, 2, et 10 ils considèreront le 10 comme allant après le 1 et avant le 2 (puisqu'au niveau de l'ascii, 1 suivi de 0 va avant 2 suivi de rien).
Donc pour ton besoin il sera "possible" d'utiliser sed ou grep mais que dans des conditions très précises et très restreintes et l'une d'entre elles sera que tes chaines aient toujours le même nombre de caractères.
Exemples
sed -e "/[1-5]00000/p" fichier
grep "[1-5]00000" fichier
Mais ces deux exemples ne recherchent pas réellement un intervalle comme tu l'entends. Ils recherchent juste un caractère compris entre 1 et 5 (là il y a bien la notion d'intervalle mais juste limitée au caractère) puis 5 "0".
Pour ton problème précis, personnellement je conseillerais awk. Un outil puissant et pas tellement difficile à appréhender
Petit cours très rapide de awk: awk est un outil puissant permettant de filtrer un fichier au travers d'un algo de travail. Tout l'algo sera intégré entre un couple d'accolades {}. Chaque ligne du fichier sera filtré par l'algo (donc inutile de te préoccuper de la boucle sur les lignes, awk le fait pour toi).
Dans cet algo, le premier mot de la ligne se nomme "$1", le second "$2" etc. $0 contient la ligne entière. NF (Number of Field) est le nombre de mots de la ligne et NR (Number of Record) est le n° de la ligne en cours de traitement.
Une fois ces éléments intégrés, tu peux les utiliser, les tester, etc dans un algorithme comparable à celui du C (tu peux utiliser des variables à toi, des boucles for, des alternatives if, etc).
Exemple pour ton souci
awk '{if ($2 >= 120000 && $2 <= 500000) printf("%s\n", $0)}' fichier
Autre exemple qui montre les possibilités de awk: on recherche maintenant une plage de valeurs sur chaque mot de la ligne
awk '{flag=0; for (i=1; i <= NF; i++) {if ($i >= 120000 && $i <= 500000) flag=1} if (flag == 1) printf("%s\n", $0)}' fichier
Si l'algo devient trop complexe à écrire sur une ligne, tu peux l'écrire dans un fichier X (nommé généralement X.awk). Là tu t'étends dans ton écriture comme tu le sens, comme un source C. Ensuite, te suffit de dire que tu filtreras le fichier en question au travers du fichier X.awk
Exemple: fichier X.awk correspondant à l'exemple précédent
1 2 3 4 5 6 7 8 9 10 11 12 13
| {
flag=0;
for (i=1; i <= NF; i++)
{
if ($i >= 120000 && $i <= 500000)
{
flag=1;
break;
}
}
if (flag == 1)
printf("%s\n", $0);
} |
Puis tu utilises cet algo via une commande "awk -f X.awk fichier"
Partager