Bonjour
J'ai un fichier texte
Je dois extraire la ligne ou il n'y a qu'un seul fCode:
1
2
3 fefefefefzf zfzefezzf feeeeeee
cela ne marche pas mais je vois pas l'erreurCode:grep "f{1}"
Version imprimable
Bonjour
J'ai un fichier texte
Je dois extraire la ligne ou il n'y a qu'un seul fCode:
1
2
3 fefefefefzf zfzefezzf feeeeeee
cela ne marche pas mais je vois pas l'erreurCode:grep "f{1}"
c'est toujours la même erreur tu utilises des regex étendues sans le dire à grep !
j'utilise l'option -E mais il reste un problème dans l'expression
cela m'affiche les lignes avec plusieurs fCode:grep -E "[f]{1}"
donc, « afficher uniquement les lignes qui contiennent un motif donné un nombre donné de fois ».Citation:
Envoyé par darkBiche
ceci explicité, les quelques recherches que j'ai faites, et le souvenir d'une discussion ici, tendent à indiquer que ce n'est pas possible avec grep tout seul.
il faut nous en dire plus sur les moyens que tu peux mettre en œuvre.
Salut,
étrangement la même question a été posé hier sur le forum ubuntu-fr...
donc je poste la réponse donnée par pingouinux :
perso j'aurais fait un truc du genre :Code:awk '{if(gsub("f","f")==1) print}' fichier
Un peu plus long mais plus bash :)Code:
1
2
3
4
5
6
7
8 while read ligne do nombre="${ligne//[^f]}" [[ ${#nombre} -eq 1 ]] && echo "${ligne}" done <<< "fefefefefzf zfzefezzf azerty feeeeeee"
ouCitation:
Code:[[ ${#nombre} -eq 1 ]] && echo "${ligne}"
les doubles crochets n'ont pas d'utilité ici, et ainsi que les accolades si il n'y a pas de concaténation.Code:((${#nombre}==1)) && echo "$ligne"
Dans le cas particulier où le motif est une simple lettre et où ce nombre de fois est 1, il me semble (sauf erreur de ma part (sait-on jamais)) qu'il existe une solution très simple avec grep tout seul (basée sur l'indice de mon post précédent):
Code:
1
2
3
4
5
6
7 $ cat plop fefefefefzf zfzefezzf feeeeeee $ grep -e '^[^f]*f[^f]*$' plop feeeeeee
simple ET regex :koi:Citation:
il existe une solution très simple
:ccool:Citation:
avec grep tout seul
Merci, j'avais pas pensé aux (()) directement :)Citation:
les doubles crochets n'ont pas d'utilité ici, et ainsi que les accolades si il n'y a pas de concaténation.
Pour les accolades, de mon point de vue ça fait partie des bonnes pratiques, toujours les utiliser dans une variable, ça évite des erreurs...
Bien trouvé jack-ft,
j'étais parti là dessus aussi mais en omettant ^ et $ (ce qui est débile avec le recul...) et du coup ça fonctionnait pas :)
à court terme, oui;Citation:
ça évite des erreurs...
sur le long terme, c'est lourdingue.
si il n'y a pas de concaténation (comme je l'ai dit : rien d'apposé à la suite immédiate de la variable), il n'y a aucun risque.
J'ai eu la mauvaise expérience de scripts avec des trucs comme $foo/truc qui marchaient très bien.
Après un remplacement par $foo_bar/truc sans penser que ce n'était pas équivalent à ${foo}_bar/truc et cette légère modification étant noyée parmi d'autres, ça ne marchait évidemment plus tout à fait aussi bien qu'avant: ça écrivait à la racine dans "/truc" et on a eu du mal à trouver où et pourquoi!
Ça m'a bien vacciné!
Depuis j'utilise toujours les accolades... même quand il n'y a aucun risque! (sauf pour $1 $# et $@, j'avoue... :oops:)
Et je me suis habitué à cette lourdinguité! :mrgreen:
salut,
c'est un chouillat sale du fait de la répétition du motif mais je vois pas de meilleure solution à coup de regex...
par contre on peut pousser le concept du coup et éviter que ce soit trop lourd :
Code:
1
2
3
4 $ echo "covfefe" | grep -E "^([^f]*f[^f]*){1}$" $ echo "covfefe" | grep -E "^([^f]*f[^f]*){2}$" covfefe $ echo "covfefe" | grep -E "^([^f]*f[^f]*){3}$"
jack-ft => Merci, je me sens moins seul XD
On s'y fait très bien à les ajouter ... :p