Commande SED

Résolu
Bonjour,
je bloque sur un probleme qui doit etre simple à regler.

j'ai besoin d'ajouter une ligne vierge avant un motif.

J'ai créé un script dans lequel il y a ces lignes:
sed -i '/\[\//i\'"$1"'R = ' /usr/fichier.txt
sed -i '/\[\//i\'"$1"'W = '/usr/fichier.txt

resultat de mon fichier.txt
si $1 = toto

totoR =
totoW =
[/]

je voudrais obtenir ca:
totoR =
totoW =

[/]

De plus, c'est normal que la commande SED ajoute des sauts de ligne en fin de fichier ?

D'avance Merci

13 réponses

  1. Modérateur
    Salut,

    En espérant avoir bien compris ta demande...
    $ cat plop
    blabla
    blablabla
    blablaba
    [/]
    $ sed '\|[/]| i\
    \
    '"$1"'R =\
    '"$1"'W =\
    ' plop
    blabla
    blablabla
    blablaba
    
    totoR =
    totoW =
    
    [/]
    $
    Si ça marche, rajoute l'option "-i" ;-))
    1. Merci de ton retour.
      J'ai du mal à comprendre comment utiliser ce que tu me donnes.
      j'ai modifié mon script avec ca :
      sed -i '\|[/]| i\'"$1"'R = \ '"$1"'W = \' /usr/fichier.txt

      Mais ca fonctionne encore moins bien qu'avec 2 lignes.
      j'obtiens ca: $1 = toto
      totoR = totoW =
      [/]

      plus aucun saut de ligne
      1. j'ai compris.
        il fallait que je tape ca:
        sed -i '\|[/]| i\'"$1"'R = \
        '"$1"'W = \
        \' /usr/fichier.txt

        la ca marche.

        Par contre, mon script est tout laid.

        j'avais essayé ca:
        sed -i '/\[\//i\{x;p;x}' /usr/fichier.txt
        ou ca /usr/fichier.txt
        sed -i '/\[\//i\\n' /usr/fichier.txt

        mais ca marche pas.
    2. Modérateur
      Ne te sers de l'oprion "-i" qu'une fois que ta syntaxe marchera !!!
       sed  '\|[/]| i\\n'"$1"'R =\n'"$1"'W = \n'
      ;-))
      1. ca ne fonctionne pas
        resultat $1=test2

        \ntest2R =ntest2W = n
        [/]
        1. le voici:
          #!/bin/sh

          # ce script va permettre de :
          # - creer un repository
          # - changer le proprietaire et le groupe du repository en $USER
          # - chmoder le repository en 771

          # le user de Apache est :
          USER=svn

          if [ $# = 1 ]
          then
          /usr/local/subversion-1.3.1/bin/svnadmin create /svn/$1
          chown -R $USER.$USER /svn/$1
          chmod -R 771 /svn/$1
          echo repository fonctionnel.
          echo "" >> /svn/permissions.txt
          sed '\|[/]| i\\n'"$1"'R =\n'"$1"'W = \n' /svn/permissions.txt
          echo "["$1":/]" >> /svn/permissions.txt
          echo "@Adm = rw" >> /svn/permissions.txt
          echo "* =" >> /svn/permissions.txt
          echo "" >> /svn/permissions.txt
          echo "["$1":/branches]" >> /svn/permissions.txt
          echo "@Adm = rw" >> /svn/permissions.txt
          echo "@"$1"R = r" >> /svn/permissions.txt
          echo "@"$1"W = rw" >> /svn/permissions.txt
          echo "* =" >> /svn/permissions.txt
          echo "" >> /svn/permissions.txt
          echo "["$1":/tags]" >> /svn/permissions.txt
          echo "@Adm = rw" >> /svn/permissions.txt
          echo "@"$1"R = r" >> /svn/permissions.txt
          echo "@"$1"W = rw" >> /svn/permissions.txt
          echo "* =" >> /svn/permissions.txt
          echo "" >> /svn/permissions.txt
          echo "["$1":/trunk]" >> /svn/permissions.txt
          echo "@Adm = rw" >> /svn/permissions.txt
          echo "@"$1"R = r" >> /svn/permissions.txt
          echo "@"$1"W = rw" >> /svn/permissions.txt
          echo "* =" >> /svn/permissions.txt
          echo "" >> /svn/permissions.txt
          else
          echo nombre d\'argument incorrect.
          echo usage: svncreate /svn/repository
          fi
          1. Modérateur
            Tu peux afficher tes tests aussi (en rapport avec ton post #5), fichiers + commandes + résultats.

            Affiche aussi le résultat de la commande "cat -A /usr/fichier.txt" s'il ta plaît, merci.
            1. fichier de depart:
              [groups]

              Adm =

              [/]
              @Adm = rw
              * =

              --------------------------------------------------------------------------- (juste pour separer, n'appartient pas au fichier)
              cat -A /svn/permissions.txt
              [groups]$
              $
              Adm = $
              $
              [/]$
              @Adm = rw$
              * =$

              -----------------------------------------------------------------------------(juste pour separer, n'appartient pas au fichier)
              sed '\|[/]| i\\n'"$1"'R =\n'"$1"'W = \n' /svn/permissions.txt
              [groups]

              Adm =

              \nR =nW = n
              [/]
              @Adm = rw
              * =

              -----------------------------------------------------------------------------(juste pour separer, n'appartient pas au fichier)
              idealement a la fin de mon script j'aimerai obtenir ca avec $1 = toto:
              [groups]

              Adm =
              totoR =
              totoW =

              [/]
              @Adm = rw
              * =

              [toto:/]
              @Adm = rw
              @totoR = r
              @totoW = rw
              * =
              1. Modérateur
                Tiens j'ai juste modifié la syntaxe pour enlever le 1er saut de ligne :
                $ cat steph 
                [groups]
                
                Adm =
                
                [/]
                @Adm = rw
                * =
                
                $ sed  '\|[/]| i'"$1"'R =\n'"$1"'W = \n' steph 
                [groups]
                
                Adm =
                
                totoR =
                totoW = 
                
                [/]
                @Adm = rw
                * =
                
                $
                Si ça marche pas je comprends pas pourquoi !? ;-\
                Le 'cat -A" c'était justement pour afficher les caractères non-imprimables au cas ou ce seraient eux qui influençaient la non prise en compte des caractères "\n"...
                1. ca ne fonctionne toujours pas
                  voici le resultat:
                  [groups]

                  Adm =

                  totoR =ntotoW = n
                  [/]
                  @Adm = rw
                  * =

                  ca fait 4 heures que je cherche, et avec \n ca n'a jamais marché.
                  soit il ecrit n ou \n mais pas de saut de ligne.

                  c'est pour cette raison que j'ai essayé ca:
                  sed -i '/\[\//i\{x;p;x}' /usr/fichier.txt
                  c'etait sensé ajouter une ligne vierge avant un motif
                  mais j'obtient le meme resultat : il m'ecrit {x;p;x}
                  1. Modérateur
                    Et comme ça ?
                    sed '\|[/]| i\
                    '"$1"'R =\
                    '"$1"'W =\
                    ' steph
                    Ça donne quoi ?
                    1. je prend cette solution:
                      sed -i '/\[\//i\
                      '"$1"'R =\
                      '"$1"'W =\
                      '

                      celle ci:
                      sed '\|[/]| i\
                      '"$1"'R =\
                      '"$1"'W =\
                      '

                      ecrit 2 lignes plusieurs fois dans mon fichier

                      le plus important: merci de ton aide.