#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
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
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 [..].
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,
.* ne matche pas une fin de ligne, donc si ton expression inclus une fin de ligne le ] ne sera pas trouvé.
Essayesed 's/[[][^]]*]//g'
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
<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
@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