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

Résolu
'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

  1. Contributeur
    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
    1. 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
      1. Contributeur
        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
      2. 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
      3. Contributeur
        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
      4. "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
      5. Contributeur
        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