Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/03/2014, à 10:28

Spirale21

[Résolu] sed dans un fichier...marche pas

Bonjour,
je vois ce que vous vous dites, vous vous dites quelle question stupide il nous demande??:D. J'explique

a="mam[HYPERLINK www.jecomprendpas.html]an"
echo $a | sed 's/\[.*\]//g'
maman

Ok ça marche mais j'ai un fichier (test.hyper) avec plein de [HYPERLINK ....] donc naturellement je fais

sed -i.bak 's/\[.*\]//g' test.hyper

et là ça ne marche pas (dans le fichier) la commande, pourquoi ?
PS: c'est un fichier docx que j'ai transformer en txt par le programme docx2txt donc c'est pour ça j'ai plein d'hyperlink... Si une personne pouvait me donner une piste
Merci

Dernière modification par Spirale21 (Le 07/03/2014, à 22:20)


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#2 Le 07/03/2014, à 10:41

pingouinux

Re : [Résolu] sed dans un fichier...marche pas

Bonjour,
Montre quelques lignes significatives du fichier, et ce que tu veux obtenir.

Hors ligne

#3 Le 07/03/2014, à 10:44

gigiair

Re : [Résolu] sed dans un fichier...marche pas

.* ne matche pas une fin de ligne, donc si ton expression inclus une fin de ligne le ] ne sera pas trouvé.
Essaye

sed 's/[[][^]]*[]]//g'

edit :
J'ai rectifié une erreur (le dernier crochet droit doit être lui aussi entre crochets droits, en première position.

Dernière modification par gigiair (Le 08/03/2014, à 13:00)


--
JJR.

Hors ligne

#4 Le 07/03/2014, à 11:12

pingouinux

Re : [Résolu] sed dans un fichier...marche pas

Si les délimiteurs [ et ] ne sont pas sur la même ligne :

$ cat i
mam[HYPERLINK www.jecomprendpas.html]an mam[HYPERLINK www.jecomprendpas.html]an
MAM[HYPERLINK www.jecomprendpa
s.html]AN

$ sed -n '1h;2,$H;$!b;g;s/\[[^]]*\]//gp' i
maman maman
MAMAN

Édité :
Ou bien

$ sed -n '1{h;b};H;$!b;g;s/\[[^]]*\]//gp' i
maman maman
MAMAN

Dernière modification par pingouinux (Le 07/03/2014, à 20:33)

Hors ligne

#5 Le 07/03/2014, à 22:19

Spirale21

Re : [Résolu] sed dans un fichier...marche pas

Gigiair t'es trop fort..merci c'était ça le [ et ] n'était pas sur la même ligne..je ne comprends pas ta regexp, les crochets tu ne les échappent nul part à moi que dans l'intervalle il soit pris pour caractères? enfin merci
pingouilinux ton dernier sed m'a tout effacer, mais merci grâce à toi j'ai pu apprendre d'autre option de sed


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#6 Le 08/03/2014, à 05:02

pingouinux

Re : [Résolu] sed dans un fichier...marche pas

Spirale21 #5 a écrit :

pingouilinux ton dernier sed m'a tout effacer, mais merci grâce à toi j'ai pu apprendre d'autre option de sed

Ce n'est pas possible, les commandes sed que je te donne en #4 ne touchent pas à tes fichiers.

Hors ligne

#7 Le 08/03/2014, à 07:47

gigiair

Re : [Résolu] sed dans un fichier...marche pas

Spirale21 a écrit :

Gigiair t'es trop fort..merci c'était ça le [ et ] n'était pas sur la même ligne..je ne comprends pas ta regexp, les crochets tu ne les échappent nul part à moi que dans l'intervalle il soit pris pour caractères? enfin merci

Je place le crochet dans un ensemble de caractères [..].

info regexps a écrit :

To include a `]' in a character set, you must make it the first
     character.  For example, `[]a]' matches `]' or `a'.  To include a
     `-', write `-' as the first or last character of the set, or put
     it after a range.  Thus, `[]-]' matches both `]' and `-'.


--
JJR.

Hors ligne

#8 Le 08/03/2014, à 09:15

Postmortem

Re : [Résolu] sed dans un fichier...marche pas

Salut,

gigiair a écrit :

.* ne matche pas une fin de ligne, donc si ton expression inclus une fin de ligne le ] ne sera pas trouvé.
Essaye

sed 's/[[][^]]*]//g'
Spirale21 a écrit :

Gigiair t'es trop fort..merci c'était ça le [ et ] n'était pas sur la même ligne..je ne comprends pas ta regexp, les crochets tu ne les échappent nul part à moi que dans l'intervalle il soit pris pour caractères? enfin merci

Si le « [ » et le « ] » ne sont pas sur la même ligne, la commande de gigiair ne fonctionne pas ; sed ne travaille que ligne par ligne par défaut et « [^]]* » ne matche pas le fin de ligne plus que « .* » tant que sed ne travaille que sur une ligne.

$ cat fichier 
blabla[ceci
doit disparaitre]toto[disparition]titi
[ceci est effacé]
tata
$ sed 's/[[][^]]*]//g' fichier
blabla[ceci
doit disparaitre]tototiti

tata

Pour que sed travaille sur plusieurs lignes, et donc que « .* » et « [^]]* » matche une fin de ligne, il faut jouer avec la commande « N » ou avec le buffer (commandes « h » et « H ») comme l'a fait pingouinux.
Moi je ferais comme ça :

sed ':a;$!{N;ba};s/\[[^]]*\]//g' fichier

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 08/03/2014, à 10:22

Spirale21

Re : [Résolu] sed dans un fichier...marche pas

je me suis mal exprimé en fait [ et ] était sur la même ligne le \n étant après le ] mais sur l'éditeur ça ne tient pas sur une ligne. Gigiair pourrais-tu me donner la source du site de info regexps parce que je l'ai pas ou j'ai zappé un passage.


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#10 Le 08/03/2014, à 12:08

Postmortem

Re : [Résolu] sed dans un fichier...marche pas

Tu peux trouver des infos sur les expressions rationnelles dans :

man 7 regex

Ou dans le man de grep.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 08/03/2014, à 12:18

pingouinux

Re : [Résolu] sed dans un fichier...marche pas

@Postmortem :

J'avais essayé d'utiliser N au lieu de H, mais sans succès. Ta commande sed en #8 m'a permis de comprendre pourquoi.
En fait, je me débranchais vers la fin de la commande, au lieu de revenir au début comme toi, ce qui devait vider le "pattern space".
Merci

Hors ligne

#12 Le 08/03/2014, à 12:40

gigiair

Re : [Résolu] sed dans un fichier...marche pas

Spirale21 a écrit :

<snip> Gigiair pourrais-tu me donner la source du site de info regexps parce que je l'ai pas ou j'ai zappé un passage.

C'est la rubrique Regexps de l'info d'Emacs

info Emacs
m Regexps

C'est plus confortable de consulter les info depuis Emacs lui-même

C-h i d m Emacs [RET] m Regexps [RET]

C'est quand même un peu plus complet que le simple man regex

-----
PS: Je me sert d'Emacs et de son mode RE-Builder pour tester les regexps de manière interactive.

@postmortem :
J'ai fait une erreur grossière dans ma regexp, j'ai oublié de protéger le crochet gauche terminal.
Il fallait lire "[[][^]]*[]]". Ma regexp est une grande classique. Il y a juste une petite difficulté du fait de la spécificité des caractères [ et ].

Dernière modification par gigiair (Le 08/03/2014, à 12:58)


--
JJR.

Hors ligne

#13 Le 08/03/2014, à 14:39

Postmortem

Re : [Résolu] sed dans un fichier...marche pas

gigiait a écrit :

@postmortem :
J'ai fait une erreur grossière dans ma regexp, j'ai oublié de protéger le crochet gauche terminal.
Il fallait lire "[[][^]]*[]]". Ma regexp est une grande classique. Il y a juste une petite difficulté du fait de la spécificité des caractères [ et ].

Mais même comme ça, si tu n'utilises pas N ou H, ça ne fonctionne pas si le ] n'est pas sur la ligne contenant le [ qui va avec.
Édit :
Et apparemment, ta première regex ne mettait pas d'erreur car s'il n'y a pas de [, dans sed, pas besoin de protéger le ].

Dernière modification par Postmortem (Le 08/03/2014, à 14:41)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#14 Le 08/03/2014, à 18:19

gigiair

Re : [Résolu] sed dans un fichier...marche pas

Au temps pour moi. Je ne suis pas un fin connaisseur de sed, que je n'utilise que pour modifier les fichiers de configuration. J'ai extrapolé depuis Emacs que j'utilise très souvent pour remplacer les délimiteurs d'expressions par d'autres.
Pour me ratrapper, le problème peut être résolu avec Emacs en mode batch par la commande :

emacs -batch fichier.txt --eval '(progn(replace-regexp "[[][^]]+[]]" "" nil (point-min) (point-max))(save-buffer))'

Mais ça 'excuse pas mon ignorance qui est immense, j'en suis conscient.


--
JJR.

Hors ligne