Sed suppression N 1ères lignes ki efface tout

Résolu
jil -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

je souhaite supprimer toutes les lignes avant la ligne qui contient la chaine de caractères suivante : #DATA
dans plusieurs fichiers texte.

Je fais :

find "/home/user/donnes/" -maxdepth 1 -name "*.txt" -type f -exec sed -i.bak '1,/^\#DATA/d' {} \;

Si les fichiers contiennent #DATA ça marche.
Mais si ces lignes ont déjà été supprimées, ça effacer l'intégralité de ces fichiers et ça c'est pas bon du tout.

Une idée ?
Peut-être qu'il faut simplement remplacer le 'sed -i.bak '1,/^\#DATA/d' par autre chose ? Je ne vois pas.

Merci et bonne fin d'après-midi.

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Si les fichiers sont dans le même répertoire pas la peine de "find" :

    $ ls -1
    tata.txt
    titi.txt
    toto.txt
    tutu.txt
    
    $ head t*
    ==> tata.txt <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> titi.txt <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> toto.txt <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> tutu.txt <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    $ sed -s -i.bak '1,/^#DATA/d' t*
    
    $ ls -1
    tata.txt
    tata.txt.bak
    titi.txt
    titi.txt.bak
    toto.txt
    toto.txt.bak
    tutu.txt
    tutu.txt.bak
    
    $ head t*
    ==> tata.txt <==
    bli
    blibli
    bli
    
    ==> tata.txt.bak <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> titi.txt <==
    bli
    blibli
    bli
    
    ==> titi.txt.bak <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> toto.txt <==
    bli
    blibli
    bli
    
    ==> toto.txt.bak <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    ==> tutu.txt <==
    bli
    blibli
    bli
    
    ==> tutu.txt.bak <==
    bla
    blablla
    #DATA
    bli
    blibli
    bli
    
    $ 
    0
  2. jil
     
    Merci zipe mais ça ne fonctionne pas mieux : ça me vide intégralement les fichiers qui auraient déjà été corrigés (relance la commande une deuxième fois).

    :-S
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Effectivement ;-\

      Je cherche à comprendre mais je ne vois pas pourquoi sed traite les fichiers dont les motifs ne sont pas trouvés ;-((
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Il semblerait que le fait de demander un motif qui n'existe pas dans une plage commençant à la 1ère ligne serait l'équivalent d'écrire "sed '1,$d' " ;-(((

      Bon, pour contourner il suffit de faire une boucle :

      $ ls -1
      tata.txt
      tata.txt.bak
      titi.txt
      titi.txt.bak
      toto.txt
      toto.txt.bak
      tutu.txt
      tutu.txt.bak
      
      $ head *
      ==> tata.txt <==
      bli
      blibli
      bli
      
      ==> tata.txt.bak <==
      bla
      blablla
      #DATA
      bli
      blibli
      bli
      
      ==> titi.txt <==
      bli
      blibli
      bli
      
      ==> titi.txt.bak <==
      bla
      blablla
      #DATA
      bli
      blibli
      bli
      
      ==> toto.txt <==
      bli
      blibli
      bli
      
      ==> toto.txt.bak <==
      bla
      blablla
      #DATA
      bli
      blibli
      bli
      
      ==> tutu.txt <==
      bli
      blibli
      bli
      
      ==> tutu.txt.bak <==
      bla
      blablla
      #DATA
      bli
      blibli
      bli
      
      $ sed -s -i.bak '1{:z;N;/.*\n#DATA/! bz;d}' * 
      
      $ ls -1
      tata.txt
      tata.txt.bak
      tata.txt.bak.bak
      titi.txt
      titi.txt.bak
      titi.txt.bak.bak
      toto.txt
      toto.txt.bak
      toto.txt.bak.bak
      tutu.txt
      tutu.txt.bak
      tutu.txt.bak.bak
      
      $ head *
      ==> tata.txt <==
      bli
      blibli
      bli
      
      ==> tata.txt.bak <==
      bli
      blibli
      bli
      
      ==> tata.txt.bak.bak <==
      bli
      blibli
      bli
      
      ==> titi.txt <==
      bli
      blibli
      bli
      
      ==> titi.txt.bak <==
      bli
      blibli
      bli
      
      ==> titi.txt.bak.bak <==
      bli
      blibli
      bli
      
      ==> toto.txt <==
      bli
      blibli
      bli
      
      ==> toto.txt.bak <==
      bli
      blibli
      bli
      
      ==> toto.txt.bak.bak <==
      bli
      blibli
      bli
      
      ==> tutu.txt <==
      bli
      blibli
      bli
      
      ==> tutu.txt.bak <==
      bli
      blibli
      bli
      
      ==> tutu.txt.bak.bak <==
      bli
      blibli
      bli
      
      $
      0
  3. jil
     
    Okay, alors j'ai pas essayé parce qu'entre temps je me suis apperçu que tous les fichiers commençaient par PE en début de première ligne :

    Donc un coup de
    find "/home/user/donnes/" -maxdepth 1 -name "*.txt" -type f -exec sed -s -i.bak '/^PE*/,/^\#DATA/d' {} \;

    fonctionne apparemment pas mal non plus.

    (le "find" j'en ai réellement besoin dans mon cas)

    ;-)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      (le "find" j'en ai réellement besoin dans mon cas
      Pourquoi tu dois faire du récursif ?
      0
    2. jil
       
      je travaille sous Octave.
      j'ai besoin d'exécuter des commandes systèmes grace à la fonction "system(la_commande)" ou "la_commande" doit correspondre à ce qu'on entre dans un terminal normalement (à quelques petits détails près au niveau des caractères d'échappement).

      j'ai besoin de "find" parce qu'on ne sait pas où on se situe à la base, et que je garde dans une autre variable, la valeur du chemin d'accès créé par l'utilisateur. Et je fais un "find" sur cette variable finalement pour aller chercher "ses" fichiers, et pas d'autres.
      Mais à la base je peux être n'importe où dans l'arborescence de l'ordinateur et ça doit marcher quand même ;-)
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ok ;-)
      0