Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2151 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  faire un sed (un peu ?) avancé

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

faire un sed (un peu ?) avancé

n°1133054
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 13:47:12  profilanswer
 

Bonjour les poulets,
 
j'ai le problème suivant à résoudre:
suite à un changement de compilateur, les programmes avec une apostrophe dans les commentaires ne compile plus.
charge à moi de substituer ces apostrophes par des espaces
 
sachant que: c'est le caractère ! qui commence le commentaire
                   ce même caractère ! ne commence pas de commentaire si placé entre des "
 
j'ai donc ce fichier exemple:

Citation :

!ceci est un commentaire avec l'apostrophe qui doit disparaitre
là c
'est une commande ou ne doit pas disparaitre ! là un commentaire ou l'apostrophe doit disparaitre
 
ceci est un "!" qui ne doit pas faire disparaitre l'apostrophe
il doit meme avec plusieurs fois "!" car on est jamais sur que "!" ne doit pas faire disparaitre l'apostrophe


et j'en suis arrivé à ce sed: sed "/![^"]/,/$/  s/'/ /g"

Citation :

!ceci est un commentaire avec l apostrophe qui doit disparaitre
là c est une commande ou ne doit pas disparaitre ! là un commentaire ou l apostrophe doit disparaitre
 
ceci est un "!" qui ne doit pas faire disparaitre l'apostrophe
il doit meme avec plusieurs fois "!" car on est jamais sur que "!" ne doit pas faire disparaitre l'apostrophe


mais l'apostrophe de "c'est" en deuxième ligne disparait également alors qu'il devrait rester.
quelqu'un pour un coup de main ?

mood
Publicité
Posté le 05-05-2009 à 13:47:12  profilanswer
 

n°1133057
wedgeant
Da penguin inside
Posté le 05-05-2009 à 13:51:29  profilanswer
 

la réponse se trouve dans ta réponse, en lisant la page de man et en analysant ta commande sed tu comprendras pourquoi [:mrbrelle]


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133058
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 05-05-2009 à 13:51:43  profilanswer
 

c'est un devoir ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1133064
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 14:06:38  profilanswer
 

c'est pas un devoir nan
 
en faite, j'ai l'impression que du moment que le motif début et le motif fin est trouvé dans une ligne, la commande de substitution s'applique sur toute la ligne est non pas uniquement entre les deux motifs début et fin.
 
sinon pour mon post précédent, mes antislash se sont fait viré
c'est donc sed "/\![^\"]/,/$/  s/\'/ /g"

n°1133070
wedgeant
Da penguin inside
Posté le 05-05-2009 à 14:09:54  profilanswer
 

mway, c'est un sujet de stage quoi [:ddr555]
 
Sinon, je persiste, tu as la solution sous les yeux, et je dirais même que tu te la mets toi même en évidence puisque tu expliques parfaitement le comportement de ta commande. Charge à toi de bien lire la page de man et de comprendre pourquoi :o


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133071
black_lord
Modérateur
Truth speaks from peacefulness
Posté le 05-05-2009 à 14:10:10  profilanswer
 

wedge tu peux répondre du coup :o


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
n°1133072
wedgeant
Da penguin inside
Posté le 05-05-2009 à 14:16:43  profilanswer
 

black_lord a écrit :

wedge tu peux répondre du coup :o


[:rofl] [:kainedemon]  
 
la réponse est là dedans:

sed "/\![^\"]/,/$/  s/\'/ /g"


 
[:cupra]
 


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133073
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 14:30:28  profilanswer
 

mouarf   :o  
 
faudrait que je refasse mon motif de début de toute façon car en plus je pars du postulat que si ! ne commence pas un commentaire, alors il est forcément suivi d'un " ce qui est loin d'être certain.
 
il me faut donc faire comprendre à sed de n'enlever les apostrophes qu'après la présence d'un point d'exclamation signifiant un commentaire (c'est à dire non compris entre des guillemets et peut etre également le cas où il serait échappé)

n°1133075
wedgeant
Da penguin inside
Posté le 05-05-2009 à 14:36:03  profilanswer
 

non mais euh ... [:pingouino]
déjà, avant de tout refaire, analyse ta commande:

 

/\![^\"]/ = tu match ! non suivi de ", et tu traites le bordel qui est entre ça et la fin de ligne, ok faudrait virer le " mais on s'en tape (d'ailleurs le ,/$/ ne sert pas à grand chose ...)
s/\'/ /g = tu changes tes ' en espaces, c'est là qu'il y a quelque chose à changer

 

on va plus loin:
s/// = substitution de ce qu'il y a entre les premier // par ce qu'il y a entre les deuxièmes //
\' = match tous les '
   = espace
g = effectue la substitution sur toute la ligne matchée

 

tout ça est expliqué dans la page de man, il te suffisait de la lire correctement :spamafote:


Message édité par wedgeant le 05-05-2009 à 14:42:18

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133082
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 14:56:29  profilanswer
 

j'ai mal du m'expliquer alors:
 
1 - remplacer tout les apostrophes dans un commentaire par des espaces
2- un commentaire commence par un point d'exclamation à n'importe qu'elle endroit d'une ligne (pas forcément au début)
3- le point d'exclamation ne marque pas le début d'un commentaire si placé entre " ou si échappé
 
je recherche donc un moyen d'exprimer tout motif commençant par ! et allant jusqu'à la fin de la ligne et de substituer à l'intérieur de se motif (et non pas sur toute la ligne) les n apostrophes par des espaces.
 
mon [^\"] est là pour dire que que ! peut être suivis de n'importe quel caractère sauf le " (cf le postulat disant que si le ! est entre " alors il ne marque pas le début d'un commentaire).
 
 
maintenant, il est fort possible que je cherche midi à quatorze heure  :D

mood
Publicité
Posté le 05-05-2009 à 14:56:29  profilanswer
 

n°1133083
wedgeant
Da penguin inside
Posté le 05-05-2009 à 15:11:29  profilanswer
 

ah bah ok, j'avias pas compris en effet :o

 

Donc, t'as du texte genre:

blablabla !<commentaire>
!<commentaire>
bla "!" blabla "!" blbalba !<commentaire>


et c'est dans la partie <commentaire> qu'il faut remplacer les simple quotes ... bon bon bon :o

 

sed '/[^\"]\![^\"]*$/ s/\'/ /g'


devrait marcher :jap:

 

si tu écrits quelque part /M/,/$/ ça veut dire que tu traites tout allant du premier match M à la fin du fichier, et pas du premier match à la fin de la ligne :D
/M*$/ correspond au premier match M jusqu'à la fin de la ligne :jap:

 

edit: à utiliser comme ça:

sed -ibak -e '/[^\"]\![^\"]*$/ s/\'/ /g' fichier


Message édité par wedgeant le 05-05-2009 à 15:12:18

---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133085
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 15:21:51  profilanswer
 

merci mais ça revient quasiment au même que mon sed précédent, meme si ta proposition est plus élégante.
 
si sur une ligne, des apostrophes sont présentes avant qu'un commentaire ne commence, elles seront supprimés aussi.
 

Citation :

sed "/\![^\"]*[^\"]*$/ s/\'/ /g" test
!ceci est un commentaire sans apostrophe
!ceci est un commentaire avec l apostrophe qui doit disparaitre ok
c est une commande ou ne doit pas disparaitre ! là un commentaire ou l apostrophe doit disparaitre nok
 
ceci est un "!" qui ne doit pas faire disparaitre l'apostrophe ok
il doit meme avec plusieurs fois "!" car on est jamais sur que "!" ne doit pas faire disparaitre l'apostrophe ok


 
comment faire en sorte que la substitution ne s'applique que sur la partie de la ligne qui match l'expression régulière ?
 
 
edit:
je ne vois pas à quoi correspond -ibak mais ne toute façon, le sed présent sur l'aix 4.3 où j'dois accomplir cette mission ne connais aucune de ces 4 options.
 
va falloir que j'me paluche la doc de awk non ?


Message édité par smea le 05-05-2009 à 15:26:06
n°1133089
wedgeant
Da penguin inside
Posté le 05-05-2009 à 15:44:37  profilanswer
 

accessoirement, faut mettre la commande s/..../g entre {} ...

sed '/[^\"]\![^\"]*$/ {s/\'/ /g}'


 
Sinon, pourquoi tu as déplacé le ! et que tu l'as remplacé par un * :??:
Et awk ne changera pas grand chose au résultat, ils fonctionnent pareil tous les deux :spamafote:


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
n°1133094
smea
alias peshane SW-1088-1675-051
Posté le 05-05-2009 à 16:08:15  profilanswer
 

oué j'ai merdé sur le poste précédent, au temps pour moi  :o  
 
concernant les accolades, j'avais testé avant de poster mais sed ne peut parser l'expression:
 

Citation :

sed "/[^\"]\![^\"]*$/ {s/\'/ /g}" test
sed: 0602-404 Function /[^"]\![^"]*$/ {s/\'/ /g} cannot be parsed.


 
si j'englobe l'expression entre des simples quotes, le shell considère que j'ai pas terminé de taper la commande:

Citation :

sed '/[^\"]\![^\"]*$/ {s/\'/ /g}' test
>

n°1133136
Aiua
PSN : Aiua / GT : Aiua42
Posté le 05-05-2009 à 18:45:15  profilanswer
 

peut être un 2e \ avant le \'
 
sinon j'dirai qu'il faut aussi un ? après le 1e [^\"]


---------------
"The pen is mightier than the sword if the sword is very short, and the pen is very sharp." TP. Mes Jeux. Mes Ventes. Groupe HFR sur PlayFire.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  faire un sed (un peu ?) avancé

 

Sujets relatifs
grub me joue-t-til des tours ? Edit, ca avance | Solutionné | A moitiéLinux avance !
ioview et netview pour mesurer les débits DD et net sous Linux (v1.04)Linux sur disque dur externe [Des problémes]
Aidez moi à choisir pour mon retour sous Linux. Merci d'avance :)Choix d'un webmail avancé avec des fonctions de groupware
Gnome 2.10...MDK 2006, configuration avancé...invalid ICMP type 11 [ça avance]
Gnome...Configuration avancé, blocage...debian: l'horloge avance d'une heure
Plus de sujets relatifs à : faire un sed (un peu ?) avancé


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)