Malheureusement, diffuser largement des informations et se protéger des spams sont deux objectifs mutuellement exclusifs. Comment veux-tu que les gens accrochent à ce que tu proposes si tu expliques rien dans ton message de départ et s'il faut aller à la chasse aux infos pour imaginer de quoi tu parles ... ?
En ce qui concerne l'édition de mon pessage précédent ... l'interface de linuxfr ne permet pas de faire ça (et heureusement). Si tu l'avais expliqué dans ton message, j'aurais pas fait de lien ... mais encore une fois, vu le peu de contenu de ton message, désolé, mais tu n'as à t'en prendre qu'à toi même sur ce coup là ...
Si un admin passe dans le coin ... sinon ... faudra faire avec le spam (de toute façon, il faut faire avec le spam ... :/ )
pour conclure, je te prie de m'excuser de m'être un peu intéressé à ce que tu faisais ... (humour ! humour ! ;-)
Bon déjà, autant donner le lien vers http://upsideup.free.fr/ puisque c'est là bas qu'il y a des trucs à lire. Accessoirement, faire un message un tout petit peu explicatif, ça ne serait pas mal pris je pense :-)
Sinon, je suis relativement néophyte en la matière, mais je n'ai pas trouvé de références vers les travaux d'autres gens sur ton site. Quelles références as-tu sur la conception des AI ? Si la réponse est 0, je ne peux que t'inviter à farfouiller sur le grand 'Ternet, y a surement des trucs intéressants à glaner.
Sinon, je m'interroge sur le choix du langage. Je ne dis pas que le C, c'est nul (vu que j'en fais tous les jours :), mais il me semble que dans le domaine, c'est plutôt les langages fonctionnels qui ont la cote.
D'autre part, pour un truc qui n'a pas besoin de trop s'interfacer avec le système, et qui n'a pas trop besoin de perfos dans un premier temps, ça parait plus sain de partir d'un bon langage de script (au hasard python) ou d'un lisp quelconque ..
au passage, quelques critiques rapides, et j'espère constructives, sur le code que j'ai vu :
la déclaration de variables comme ça : void *e01 (); void *e02 (); void *e03 (); void *e04 (); void (...)
c'est à se flinguer .. Déjà, tu en as une quantité limitée (à moins de te gaver à en déclarer plus quand t'as besoin) et pas de possibilité d'en rajouter dynamiquement (ce qui est plutôt dommage).
Autre point, le nommage : comment t'y retrouves tu entre e05 et e87 ? A mon avis, environ personne n'a envie de se mettre dans le crane le role fonctionnelle de 100 fonctions de type e* ... c'est une barrière d'entrée dans le projet non négligeable ...
ah oui, avec des void * dans tous les sens, tu vas passer ton temps à caster tes pointeurs vers des types divers et variés. Ca serait surement plus simple avec un langage un peu introspectif ...
C'est aussi plus simple pour un langage de scripts de se rajouter des bouts tout seul sans rien avoir à recompiler ...
bref, il y a, à mon avis, quelques trucs à revoir pour rendre ton projet plus "sexy" pour des nouveaux venus :-)
PS: ah oui, comme je suis aussi grognon, j'aime pas du tout le mot "collaborateur". Je sais très bien ce que c'est (puisque j'en serais un). C'est du consultant jmelapète langue de bois, pour pas dire que on est juste un grouillot :D
Pour Struts, je peux pas te dire, on a un J2EE lead architecte ('tain, y avait longtemps ;-) qui s'occupe de ça, pis je suis pas super fan de java.
Par contre, pour filer un coup de main, j'ai fait un petit peu d'Hibernate.
Le "Hibernate, Java Persistence with Hibernate" chez Manning m'a permis de faire ce que je voulais sans *tout* lire. En bonus, il a l'air bien complet et bien fait.
J'ai un peu lutté pour coller le plug in Hibernate dedans Eclipse. C'est p-e aussi parce que j'avais jamais utilisé Eclipse avant, alors avant d'avoir un environnement Jboss/Struts/hibernat/maven et que sais-je encore ...
Concernant Hibernate, la démarche consistant à faire un chouette schéma entité/association a bien fonctionné pour nous. Hibernate génère quand même un peu les trucs à sa sauce, et le schéma relationnel résultant correspond pas toujours à ce que j'aurais défini en sql pur mais bon. Le point le plus notable est l'utilisation systèmatique de clefs primaires générées plutôt que de clefs primaires naturelles.
Bon, même sans être un gros fan de Java, faut reconnaitre qu'Hibernate fait économiser un bon gros paquet de code, surtout sur le chargement/sauvegarde d'objets en DB (forcément, c'est à ça que ça sert ;-)
désolé, j'ai un peu dérivé, mais ça m'a fait du bien d'en parler, merci de votre attention :-D
ah oui, en fait, tu veux un seul namespace titi par fichier .. ?
pour travailler sur la dernière occurence d'un motif dans un fichier, on ne peut pas utiliser une commande qui fonctionne ligne à ligne. On est bien forcé de parser au moins une fois le fichier jusqu'au bout pour identifier la ligne ou on veut intervenir.
Dans ton cas, plusieurs solutions :
- identifier le numéro de ligne du #endif qui t'intéresse (par exemple avec grep -n) et insérer ensuite ton accolade fermante avec une combinaison de head et tail
- compter le nombre d'occurences de #endif, et transmettre cette info à sed pour qu'il n'intervienne que sur cette occurence du motif. Je te laisse explorer un peu la doc de sed / grep.
Je te renvoie à l'excellent lien du commentaire http://linuxfr.org/comments/868660.html#868660
"Sinon tu es un chef !!"
merci :)
au bout de quelques années d'utilisation intensive, on finit par apprendre 2/3 trucs, surtout quand on aime ça ;)
Je t'invite très fortement à lire un tutoriel sur les regex et/ou sur sed.
tu pourrais faire un truc comme : sed -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
quelques rappels rapide pour comprendre. Le caractère ^ représente le début de la ligne, $ : la fin de ligne, & : est remplacé par le motif recherché dans la chaine de substitution, \n : un retour chariot dans la chaine de substitution, < indique un début de mot, et >, une fin de mot. [^;] matche n'importe quel caractère sauf ;
d'autre part, ton for file in `ls *.h` se remplace avantageusement par for file in *.h.
Autre remarque, le ls n'étant pas récursif, ça ne fonctionera pas si ton arborescence n'est pas plate. find est là pour t'aider, genre :
for i in `find . -name '**.h'
sauf qu'on peut faire encore mieux avec l'option -exec de find, ou, encore mieux, avec xargs et l'option -i de sed (qui indique à sed de travailler directement sur le fichier en entrée) find . -name "*.h" | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
encore quelques petites remarques:
l'expression 's/^}$/&\n&/' est p-e pas assez fine. Elle dupliquera toutes les lignes ne contenant qu'une accolade fermante. Si ton contient des accolades fermantes qui ne sont pas des fermetures de classes, tu te retrouveras avec trop d'accolades après le traitement.
Evidemment, il y a des solutions, à base de comptage d'accolades ouvrantes et fermantes, pour ne rajouter des accolades fermantes que quand il le faut.
Si tu veux pouvoir relancer le script sans risquer de traiter deux fois le même fichier, tu peux rajouter un grep -c "\<namespace titi\>' pour faire quelque chose comme (on respire un grand coup :) : find . -name '*.h' | grep -c '\<namespace titi\>' | cut -d ':' -f 1 | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
bon, ça fait p-e beaucoup ... Si tu prends bien le temps de comprendre chaque améloration que je propose, tu devrais pas mal progression dans ton approche des scripts shell.
ça reste toujours une question de trouver le bon motif.
ici, en fait, tu n'ajouteras le namespace que pour le motif ^class[^;]*$ et pas le seul motif ^class
Si tu t'en sors pas avec ça, dis le, j'essaierai de te proposer un script ...
si y a plusieurs classes, c'est pas bien grave. sed traitera tout le fichier et donc toutes les déclarations du dit fichier.
Pour les forward declaration, j'avoue humblement mon ignorance .. je ne sais pas ce que c'est. Et j'ai des petits soucis réseau qui font que google me répond pas.
un petit brief sur ce que c'est et pourquoi ça pose problème dans ton cas ?
Perso, je suis super rigoureux sur l'indentation. Si c'était mon code, je sais que je pourrais m'appuyer sur le motif ^class\> pour ajouter namespace titi\n{ et sur le motif ^}$ pour ajouter un \n} dans les .h
Pour les cpp, s'il y a d'autres directives using, rien de plus simple que d'en rajouter une. Sinon, il faut arriver à identifier un motif qui te permettrait de rajouter ton using à un endroit pertinent. La, ça dépend de ton code.
Si l'identation de ton code n'est pas 100 % fiable, tu peux p-e te mettre dans une situation maitrisée (au moins pour les éléments qui t'intéressent) en farfouillant dans les options d'indent.
oui. Si on te propose une machine avec forcément un linux dessus, c'est aussi de la vente liée, si l'install et/ou le cd de la distrib sont facturées. Personne dit le contraire je pense.
L'objectif, c'est pas non plus qu'il n'y ait plus de machines préinstallés avec des OS, juste d'avoir le choix de l'OS, voire de *pas avoir* d'OS.
je suis plus d'accord avec Archibald là.
le fait que j'ai mis un cat dans mon commentaire précédent, c'est vraiment un artefact de ma méthode de dév de regex. La finalisation du script consiste à virer toutes les scories du genre un cat qui traîne.
Pour un "vrai" script, le cat aurait vite sauté :-)
pour l'exemple que tu donnes, si tu veux conserver une copie de ton fichier de départ, je ferais plus un :
tar czf fichier.tar.gz fichier
sed -i xxxxx fichier
parce que pendant que tu élabores la regex, c'est plus facile de modifier la fin de ta ligne (la regex) si y a pas le nom de fichier en fin de ligne.
Après, pas pensé nettoyé ... je suis contre l'utilisation de cat dans une série d'opérations pipée aussi :)
clair que ça dépend du contexte ...
Ca te conviendra pas forcément, mais avec les commandes usuelles du shell : cat | grep -Ev '^.{4}[[:space:]]{10}' | cut -c 4-14
pas si mal que ça. Au vu des messages que tu as posté ces derniers temps, y a une nette progression déjà :)
Le problème fondamental, c'est que sed travaille ligne par ligne, et là, tu veux faire quelquechose pour lequel il faut travailler sur plusieurs lignes. Forcément, ça va être compliqué ...
en repartant de ton exemple dans un commentaire ci dessus, une proposition en awk : awk 'BEGIN{prev="unset"} /^const\>|^int\>|^temp\>/ {if (prev != $1) print ""; print $0; next} {print}'
attention, cette version ne fonctionne que si tes identifiants (int, const ou autre) sont en début de ligne puisque $1 représente le premier élément de la ligne.
C'est pas le hello world du awk, donc l'opportunité d'apprendre quelques trucs de plus ;)
man awk pour plus de détails, et pose d'autres questions si tu t'en sors pas !
y a tellement de façon d'approcher le problème. Au choix :
- avec awk (pas trop compliqué, mais moyen performant),
- en utilisant l'option -c de grep et une habile combinaison de head et de tail dans tous les sens (p-e pas super efficace, mais ça doit être rigolo à écrire =)
- en encapsulant tes regex dans un langage de script de plus haut nieveau (python, perl, ruby, ...)
l'option -e de sed, c'est pour faire la v2 de ton script ;-)
En fait, plutôt que lancer plusieurs sed avec une regex chacun, tu peux lancer un seul sed avec plusieurs regex. L'option -e permet de faire ça, genre : sed -e regex1 -e regex2 ... -e regexn
Possible que sur certaines plate forme, l'option -e soit obligatoire, même quand il y a une seule regex. Je ne sais plus trop, mais j'ai pris l'habitude de le mettre tout le temps maintenant ...
quelques remarques pour améliorer ton script : for file in [^$prefix]*
do
echo $file
done
fonctionne chez moi ... Bizzare que ça ne passe pas chez toi.
- Tu peux éventuellement utiliser des trucs spécifiques à bash (moins portable donc ) : shopt -s extglob
for file in !($prefix); do
echo $file
done
man bash pour plus de détails
- pour éviter tous les fichiers temporaires, tu peux utiliser l'option -i de sed
- une regex plus simple pour matcher le motif virgule ou virgule + espace est : , \? (soit virgule + espace + point d'interrogation echappé). Ensuite, dans ton motif de substitution, tu n'as plus besoin d'échapper les caractère 's/, \?/, /g' doit suffire. Les motifs \< et \> ne sont pas utiles ici, puisque l'espace et la virgule sont déjà des délimiteurs de mot.
- pour rajouter END à la fin, le mieux, c'est encore : echo $end >> $file
(simple is beautiful ;)
sed -e 's/\/\//#/g' fichier ça doit le faire.
Sinon, on l'oublie souvent (voire on le sait pas), mais on peut utiliser n'importe quel caractère comme séparateur pour sed, genre '~'
du coup, sed -e 's~//~#~g' fichier, ça le fait aussi
[^] # Re: en C ?
Posté par gaaaaaAab . En réponse au message des passionnés d'IA dans la salle ?. Évalué à 4.
En ce qui concerne l'édition de mon pessage précédent ... l'interface de linuxfr ne permet pas de faire ça (et heureusement). Si tu l'avais expliqué dans ton message, j'aurais pas fait de lien ... mais encore une fois, vu le peu de contenu de ton message, désolé, mais tu n'as à t'en prendre qu'à toi même sur ce coup là ...
Si un admin passe dans le coin ... sinon ... faudra faire avec le spam (de toute façon, il faut faire avec le spam ... :/ )
pour conclure, je te prie de m'excuser de m'être un peu intéressé à ce que tu faisais ... (humour ! humour ! ;-)
[^] # Re: tous les jours ..?
Posté par gaaaaaAab . En réponse au sondage Vous lisez LinuxFr.org :. Évalué à 6.
Vu que les sondages ne changent pas si souvent que ça, ça m'arrive de pas détecter tout de suite qu'il y en a un nouveau.
Je lag d'un jour là ... (en même temps, avec un premier commentaire à 23 h hier soir .. je lag p-e pas tant que ça :)
# en C ?
Posté par gaaaaaAab . En réponse au message des passionnés d'IA dans la salle ?. Évalué à 2.
Sinon, je suis relativement néophyte en la matière, mais je n'ai pas trouvé de références vers les travaux d'autres gens sur ton site. Quelles références as-tu sur la conception des AI ? Si la réponse est 0, je ne peux que t'inviter à farfouiller sur le grand 'Ternet, y a surement des trucs intéressants à glaner.
Sinon, je m'interroge sur le choix du langage. Je ne dis pas que le C, c'est nul (vu que j'en fais tous les jours :), mais il me semble que dans le domaine, c'est plutôt les langages fonctionnels qui ont la cote.
D'autre part, pour un truc qui n'a pas besoin de trop s'interfacer avec le système, et qui n'a pas trop besoin de perfos dans un premier temps, ça parait plus sain de partir d'un bon langage de script (au hasard python) ou d'un lisp quelconque ..
au passage, quelques critiques rapides, et j'espère constructives, sur le code que j'ai vu :
la déclaration de variables comme ça :
void *e01 (); void *e02 (); void *e03 (); void *e04 (); void (...)
c'est à se flinguer .. Déjà, tu en as une quantité limitée (à moins de te gaver à en déclarer plus quand t'as besoin) et pas de possibilité d'en rajouter dynamiquement (ce qui est plutôt dommage).
Autre point, le nommage : comment t'y retrouves tu entre e05 et e87 ? A mon avis, environ personne n'a envie de se mettre dans le crane le role fonctionnelle de 100 fonctions de type e* ... c'est une barrière d'entrée dans le projet non négligeable ...
ah oui, avec des void * dans tous les sens, tu vas passer ton temps à caster tes pointeurs vers des types divers et variés. Ca serait surement plus simple avec un langage un peu introspectif ...
C'est aussi plus simple pour un langage de scripts de se rajouter des bouts tout seul sans rien avoir à recompiler ...
bref, il y a, à mon avis, quelques trucs à revoir pour rendre ton projet plus "sexy" pour des nouveaux venus :-)
PS: ah oui, comme je suis aussi grognon, j'aime pas du tout le mot "collaborateur". Je sais très bien ce que c'est (puisque j'en serais un). C'est du consultant jmelapète langue de bois, pour pas dire que on est juste un grouillot :D
# Hibernate
Posté par gaaaaaAab . En réponse au message Apprendre struts. Évalué à 3.
Par contre, pour filer un coup de main, j'ai fait un petit peu d'Hibernate.
Le "Hibernate, Java Persistence with Hibernate" chez Manning m'a permis de faire ce que je voulais sans *tout* lire. En bonus, il a l'air bien complet et bien fait.
J'ai un peu lutté pour coller le plug in Hibernate dedans Eclipse. C'est p-e aussi parce que j'avais jamais utilisé Eclipse avant, alors avant d'avoir un environnement Jboss/Struts/hibernat/maven et que sais-je encore ...
Concernant Hibernate, la démarche consistant à faire un chouette schéma entité/association a bien fonctionné pour nous. Hibernate génère quand même un peu les trucs à sa sauce, et le schéma relationnel résultant correspond pas toujours à ce que j'aurais défini en sql pur mais bon. Le point le plus notable est l'utilisation systèmatique de clefs primaires générées plutôt que de clefs primaires naturelles.
Bon, même sans être un gros fan de Java, faut reconnaitre qu'Hibernate fait économiser un bon gros paquet de code, surtout sur le chargement/sauvegarde d'objets en DB (forcément, c'est à ça que ça sert ;-)
désolé, j'ai un peu dérivé, mais ça m'a fait du bien d'en parler, merci de votre attention :-D
[^] # Re: sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
pour travailler sur la dernière occurence d'un motif dans un fichier, on ne peut pas utiliser une commande qui fonctionne ligne à ligne. On est bien forcé de parser au moins une fois le fichier jusqu'au bout pour identifier la ligne ou on veut intervenir.
Dans ton cas, plusieurs solutions :
- identifier le numéro de ligne du #endif qui t'intéresse (par exemple avec grep -n) et insérer ensuite ton accolade fermante avec une combinaison de head et tail
- compter le nombre d'occurences de #endif, et transmettre cette info à sed pour qu'il n'intervienne que sur cette occurence du motif. Je te laisse explorer un peu la doc de sed / grep.
Je te renvoie à l'excellent lien du commentaire http://linuxfr.org/comments/868660.html#868660
"Sinon tu es un chef !!"
merci :)
au bout de quelques années d'utilisation intensive, on finit par apprendre 2/3 trucs, surtout quand on aime ça ;)
[^] # Re: sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
tu pourrais faire un truc comme :
sed -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
quelques rappels rapide pour comprendre. Le caractère ^ représente le début de la ligne, $ : la fin de ligne, & : est remplacé par le motif recherché dans la chaine de substitution, \n : un retour chariot dans la chaine de substitution, < indique un début de mot, et >, une fin de mot. [^;] matche n'importe quel caractère sauf ;
d'autre part, ton for file in `ls *.h` se remplace avantageusement par for file in *.h.
Autre remarque, le ls n'étant pas récursif, ça ne fonctionera pas si ton arborescence n'est pas plate. find est là pour t'aider, genre :
for i in `find . -name '**.h'
sauf qu'on peut faire encore mieux avec l'option -exec de find, ou, encore mieux, avec xargs et l'option -i de sed (qui indique à sed de travailler directement sur le fichier en entrée)
find . -name "*.h" | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
encore quelques petites remarques:
l'expression 's/^}$/&\n&/' est p-e pas assez fine. Elle dupliquera toutes les lignes ne contenant qu'une accolade fermante. Si ton contient des accolades fermantes qui ne sont pas des fermetures de classes, tu te retrouveras avec trop d'accolades après le traitement.
Evidemment, il y a des solutions, à base de comptage d'accolades ouvrantes et fermantes, pour ne rajouter des accolades fermantes que quand il le faut.
Si tu veux pouvoir relancer le script sans risquer de traiter deux fois le même fichier, tu peux rajouter un grep -c "\<namespace titi\>' pour faire quelque chose comme (on respire un grand coup :) :
find . -name '*.h' | grep -c '\<namespace titi\>' | cut -d ':' -f 1 | xargs sed -i -e 's/^class[^;]*$/namespace titi\n{ \n&/g' -e 's/^}$//' -e 's/^}$/&\n&/'
bon, ça fait p-e beaucoup ... Si tu prends bien le temps de comprendre chaque améloration que je propose, tu devrais pas mal progression dans ton approche des scripts shell.
bon courage :)
[^] # Re: sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
la suite cet aprème
[^] # Re: sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
ici, en fait, tu n'ajouteras le namespace que pour le motif ^class[^;]*$ et pas le seul motif ^class
Si tu t'en sors pas avec ça, dis le, j'essaierai de te proposer un script ...
[^] # Re: sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
Pour les forward declaration, j'avoue humblement mon ignorance .. je ne sais pas ce que c'est. Et j'ai des petits soucis réseau qui font que google me répond pas.
un petit brief sur ce que c'est et pourquoi ça pose problème dans ton cas ?
# sed peut-être ?
Posté par gaaaaaAab . En réponse au message Script pour modifier C++ sources. Évalué à 2.
Pour les cpp, s'il y a d'autres directives using, rien de plus simple que d'en rajouter une. Sinon, il faut arriver à identifier un motif qui te permettrait de rajouter ton using à un endroit pertinent. La, ça dépend de ton code.
Si l'identation de ton code n'est pas 100 % fiable, tu peux p-e te mettre dans une situation maitrisée (au moins pour les éléments qui t'intéressent) en farfouillant dans les options d'indent.
[^] # Re: Dans ce cas...
Posté par gaaaaaAab . En réponse à la dépêche Acer condamné à rembourser Windows. Évalué à 3.
L'objectif, c'est pas non plus qu'il n'y ait plus de machines préinstallés avec des OS, juste d'avoir le choix de l'OS, voire de *pas avoir* d'OS.
[^] # Re: Oui mais ...
Posté par gaaaaaAab . En réponse à la dépêche Acer condamné à rembourser Windows. Évalué à 5.
[^] # Re: parser ?
Posté par gaaaaaAab . En réponse au message [expression régulière] détecter un caractère non espace dans une séquence.. Évalué à 2.
le fait que j'ai mis un cat dans mon commentaire précédent, c'est vraiment un artefact de ma méthode de dév de regex. La finalisation du script consiste à virer toutes les scories du genre un cat qui traîne.
Pour un "vrai" script, le cat aurait vite sauté :-)
pour l'exemple que tu donnes, si tu veux conserver une copie de ton fichier de départ, je ferais plus un :
tar czf fichier.tar.gz fichier
sed -i xxxxx fichier
[^] # Re: parser ?
Posté par gaaaaaAab . En réponse au message [expression régulière] détecter un caractère non espace dans une séquence.. Évalué à 2.
Après, pas pensé nettoyé ... je suis contre l'utilisation de cat dans une série d'opérations pipée aussi :)
[^] # Re: parser ?
Posté par gaaaaaAab . En réponse au message [expression régulière] détecter un caractère non espace dans une séquence.. Évalué à 2.
et préciser le moteur de regex que tu utilises puisqu'apparement, tu en utilises un.
Sinon, hors syntaxe particulière, la regex que tu vas chercher, c'est l'inversion de la regex qui matche 10 espaces consécutifs en fait.
[^] # Re: parser ?
Posté par gaaaaaAab . En réponse au message [expression régulière] détecter un caractère non espace dans une séquence.. Évalué à 1.
je pensais cat <fichier> | (...), 'videmment ...
[^] # Re: parser ?
Posté par gaaaaaAab . En réponse au message [expression régulière] détecter un caractère non espace dans une séquence.. Évalué à 1.
Ca te conviendra pas forcément, mais avec les commandes usuelles du shell :
cat | grep -Ev '^.{4}[[:space:]]{10}' | cut -c 4-14
[^] # Re: rechercher/remplacer
Posté par gaaaaaAab . En réponse au message document recapilutatif SED. Évalué à 4.
[^] # Re: fais bosser ton imagination
Posté par gaaaaaAab . En réponse au message document recapilutatif SED. Évalué à 2.
awk 'BEGIN{prev="unset"} /^const\>|^int\>|^temp\>/ {if (prev != $1) print ""; print $0; prev = $1; next} {print}'
[^] # Re: fais bosser ton imagination
Posté par gaaaaaAab . En réponse au message document recapilutatif SED. Évalué à 2.
Le problème fondamental, c'est que sed travaille ligne par ligne, et là, tu veux faire quelquechose pour lequel il faut travailler sur plusieurs lignes. Forcément, ça va être compliqué ...
en repartant de ton exemple dans un commentaire ci dessus, une proposition en awk :
awk 'BEGIN{prev="unset"} /^const\>|^int\>|^temp\>/ {if (prev != $1) print ""; print $0; next} {print}'
attention, cette version ne fonctionne que si tes identifiants (int, const ou autre) sont en début de ligne puisque $1 représente le premier élément de la ligne.
C'est pas le hello world du awk, donc l'opportunité d'apprendre quelques trucs de plus ;)
man awk pour plus de détails, et pose d'autres questions si tu t'en sors pas !
# fais bosser ton imagination
Posté par gaaaaaAab . En réponse au message document recapilutatif SED. Évalué à 2.
- avec awk (pas trop compliqué, mais moyen performant),
- en utilisant l'option -c de grep et une habile combinaison de head et de tail dans tous les sens (p-e pas super efficace, mais ça doit être rigolo à écrire =)
- en encapsulant tes regex dans un langage de script de plus haut nieveau (python, perl, ruby, ...)
bref, innove ! :-)
[^] # Re: sed -i et autres ...
Posté par gaaaaaAab . En réponse au message aide sur un script. Évalué à 2.
En fait, plutôt que lancer plusieurs sed avec une regex chacun, tu peux lancer un seul sed avec plusieurs regex. L'option -e permet de faire ça, genre :
sed -e regex1 -e regex2 ... -e regexn
Possible que sur certaines plate forme, l'option -e soit obligatoire, même quand il y a une seule regex. Je ne sais plus trop, mais j'ai pris l'habitude de le mettre tout le temps maintenant ...
# sed -i et autres ...
Posté par gaaaaaAab . En réponse au message aide sur un script. Évalué à 1.
for file in [^$prefix]*
do
echo $file
done
fonctionne chez moi ... Bizzare que ça ne passe pas chez toi.
- Tu peux éventuellement utiliser des trucs spécifiques à bash (moins portable donc ) :
shopt -s extglob
for file in !($prefix); do
echo $file
done
man bash pour plus de détails
- pour éviter tous les fichiers temporaires, tu peux utiliser l'option -i de sed
- une regex plus simple pour matcher le motif virgule ou virgule + espace est :
, \? (soit virgule + espace + point d'interrogation echappé). Ensuite, dans ton motif de substitution, tu n'as plus besoin d'échapper les caractère
's/, \?/, /g' doit suffire. Les motifs \< et \> ne sont pas utiles ici, puisque l'espace et la virgule sont déjà des délimiteurs de mot.
- pour rajouter END à la fin, le mieux, c'est encore :
echo $end >> $file
(simple is beautiful ;)
# heu ...
Posté par gaaaaaAab . En réponse au message sed et caractères spéciaux. Évalué à 4.
Sinon, on l'oublie souvent (voire on le sait pas), mais on peut utiliser n'importe quel caractère comme séparateur pour sed, genre '~'
du coup, sed -e 's~//~#~g' fichier, ça le fait aussi
sed, c'est dien
--> []
[^] # Re: grep
Posté par gaaaaaAab . En réponse au message condition et script shell. Évalué à 2.