Coller du texte au début avec sed/ed

Résolu
Bonjour,

j'ai par exemple ce fichier:
donnee1
donnee2
donnee3
donnee a mettre au debut1
donnee a mettre au debut2
donnee a mettre au debut3
donnee4

et je veux mettre au début de mon fichier les 3 lignes ci-dessus.
Voilà ce que j'ai tenté, sans succès:
sed '/donnee a mettre au debut/! {H;d}; $G' fichier

Merci de m'aider à trouver la solution à ce petit problème

5 réponses

  1. Modérateur
    Salut,

    Est-ce que les données à mettre au début seront toujours 3 lignes consécutives ?
    0
    1. Merci pour la réponse rapide (comme toujours ;))

      En fait ce fichier a été trié et les lignes à mettre au début sont consécutives et commence toutes par le même motif (popup). Leur nombre, quoique petit, est inconnu à priori, il peut y en avoir une, ou deux (c'est pour construire un menu).
      0
      1. Modérateur
        Re-

        Un peu trop complexe en mettre en oeuvre avec "sed" (et je ne sais même pas si c'est possible d'ailleurs), donc on va faire avec "ed" qui intègre une fonction de déplacement :

        jp@MDK:~/tmpfs ssh$ cat plop
        donnee1
        donnee2
        donnee3
        donnee a mettre au debut1
        donnee a mettre au debut2
        donnee a mettre au debut3
        donnee4
        
        jp@MDK:~/tmpfs ssh$ ed -s plop <<< $'v/debut/m$\nw'
        
        jp@MDK:~/tmpfs ssh$ cat plop
        donnee a mettre au debut1
        donnee a mettre au debut2
        donnee a mettre au debut3
        donnee1
        donnee2
        donnee3
        donnee4
        
        jp@MDK:~/tmpfs ssh$


        En gros, tout ce qui ne contient pas (v) le motif (/début/) est déplacé (m) en fin de fichier ($). On sauve le tout avec la commande "w".

        ;-))
        0
        1. Merci pour cette réponse.
          0
          1. >Un peu trop complexe en mettre en oeuvre avec "sed" (et je ne sais même pas si c'est possible d'ailleurs)

            Si, si et voici comment:

            #!/bin/sed -nf
            
            :a
            $!{/popup/ {p;bnext}
            {1h;1!H}
            :next
            n
            ba
            }
            {/popup/p
            H
            g
            p
            }


            j'enregistre ce qui ne doit pas apparaître en début de fichier pour ne l'afficher qu'à la fin.
            Il ne faut surtout pas utiliser la commande d sinon le fil des commandes n'est pas suivi.
            On enregistre la 1ère ligne et on ajoute les suivantes (sinon une ligne vide apparaît quand on colle la 2ème partie du fichier).

            Il est vrai que c'est un peu complexe. ;-)
            0
            1. Modérateur
              Chapeau bas et merci ;-))
              0
            2. Je suis sincèrement très honoré pour ce compliment de votre part. Merci ;-)
              0
            3. Modérateur
              Il n'y a pas de quoi ;-))
              0