[sed] problème de doubles guillemets interprétés.

Résolu/Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - Modifié par Swiss Knight le 14/12/2012 à 21:32
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - 16 déc. 2012 à 17:35
'soir tout le monde,

petite bûche (pas de Noël malheureusement) avec sed :
j'aimerai que la commande sed là en dessous :
$ echo 'du gros bla cx13z9"3§* &%\/<>asdjhdlk<b class="t2">Some Words 1</b>encore du gros blablarz313 &\"3§* &%\/<> 39q asd' > test  
$ echo 'du gros bla cx13z9"3§* &%\/<>asdjhdlk<b class="t2">Some Words 2</b>encore du gros blablarz313 &\"3§* &%\/<> 39q asd' >> test  
$ sed 's/.*\(<b class="t2">.*<\/b>\).*/\1/g' test


me retourne ça :
<b class="t2">Some Words 1</b>  
<b class="t2">Some Words 2</b>


mais apparemment les doubles guillemets dans la commande sed sont interprétés au lieu d'être lus comme tels... et mon fichier n'est pas traité.
J'ai essayé de les échapper, de les mettre entre crochets, entre guillemets simples, de les remplacer par \x22, de faire à peu près tous les mix possibles entre tout ça mais rien ne fonctionne.

Si quelqu'un voit où ça coince... Merci !

ps: je suis sous Ubuntu.
avec : GNU sed version 4.2.1

2 réponses

zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 559
14 déc. 2012 à 22:47
Salut,

Ce n'est pas un problème de guillemets, chez moi avec sed ça marche très bien, la preuve :

$ cat plop 
du gros bla cx13z9"3§* &%\/<>asdjhdlk<b class="t2">Some Words</b>encore du gros blablarz313 &\"3§* &%\/<> 39q asd
du gros bla cx13z9"3§* &%\/<>asdjhdlk<b class="t2">Some Words</b>encore du gros blablarz313 &\"3§* &%\/<> 39q asd

$ sed 's/.*\(<b class="t2">.*<\/b>\).*/\1/g' plop 
<b class="t2">Some Words</b>
<b class="t2">Some Words</b>


Mais bon c'est bien mieux avec "grep" :

grep -o '<b class="t2">[^>]*>' plop 
<b class="t2">Some Words</b>
<b class="t2">Some Words</b>

$

1
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 14/12/2012 à 22:57
Salut.

Ah ben je sais pas ce qui cloche chez moi alors.
C'est ennuyeux. :/

Et je ne savais pas que grep permettait de faire ça !!
Alors ça tombe bien ! Merci de m'avoir donne ce tuyau ; ça fonctionne apparemment très bien ! ;-)

Bonne soirée !


Ah, PS : si je ne souhaite conserver que ce qu'il y a entre les balises, à la manière des regexp quand on fait "rechercher - remplacer" : (truc entre parenthèses) ---> faire appel au truc avec : \1

Comment fait-on avec grep ? C'est possible ?

"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 559
14 déc. 2012 à 23:00
Comment fait-on avec grep ? C'est possible ?
Si tu ne veux conserver que "Some Words", il faudrait passer par des greps successifs via des "pipes", donc là mieux vaut se servir de "sed" et des référence arrières :

$ sed 's/.*<b class="t2">\([^<]*\)<\/b>.*/\1/g' plop 
Some Words
Some Words
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
14 déc. 2012 à 23:04
Ok... mais je pige pas : cette commande sed ne fonctionne pas sur le fichier de base. Il doit y avoir des caractères dans le code html qu'elle n'aime pas du tout :/

Par contre, sur le fichier résultant de la commande grep précédente, ça marche bien.

Bon et bien le but est ici atteint, merci ;)
Je coche le "résolu".
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 559
14 déc. 2012 à 23:10
Il est au format Unix ton fichier ?

Essaye en remplaçant les séparateurs par défaut ( / ) par des dièses (#) ou tout autre caractère susceptible de ne pas se retrouver dans ton code, le caractère paragraphe par exemple ( § ) :

sed 's#.*<b class="t2">\([^<]*\)<\/b>.*#\1#g' 
0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 14/12/2012 à 23:18
"il est au format Unix ton fichier ?"

> aucune idée. Comment voir ça ?

Je vais tester avec un caractère vraiment spécial alors... on peut utiliser ce genre de caractères tu penses : ?€¶?æ?µ?[¶??¥ ? Ou est-ce trop spécial... ?


edit 1 : avec le dièse # ça ne fonctionne pas mieux

edit 2 : avec le § ça me dit ceci :
sed: -e expression n°1, caractère 2: delimiter character is not a single-byte character
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 559
14 déc. 2012 à 23:22
file fichier pour le savoir, le 1er est au format Unix le second au format Dos (CRLF) :

$ file plop bar 
plop: UTF-8 Unicode text
bar:  UTF-8 Unicode text, with CRLF line terminators

$


Un autre façon de le savoir, c'est de faire un "cat -A" ou "sed -n l" sur le fichier, les fichiers Dos se terminent par ^M :

$ cat -A bar
du gros bla cx13z9"3M-BM-'* &%\/<>asdjhdlk<b class="t2">Some Words</b>encore du gros blablarz313 &\"3M-BM-'* &%\/<> 39q asd^M$
du gros bla cx13z9"3M-BM-'* &%\/<>asdjhdlk<b class="t2">Some Words</b>encore du gros blablarz313 &\"3M-BM-'* &%\/<> 39q asd^M$

$
0