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. 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.
    1. Modérateur
      Et comme ça ?
      sed '\|[/]| i\
      '"$1"'R =\
      '"$1"'W =\
      ' steph
      Ça donne quoi ?
      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
          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. 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
              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. 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
                  Ne te sers de l'oprion "-i" qu'une fois que ta syntaxe marchera !!!
                   sed  '\|[/]| i\\n'"$1"'R =\n'"$1"'W = \n'
                  ;-))
                  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
                    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" ;-))