Sed awk

Résolu
Bonjour,

j'ai un fichier texte de ce genre :

cinq1;Dupond;jean;jdupond;jdupond
cinq1;valjean,jean;jvaljean,jvaljean

cinq1 est une classe, ensuite nom; prennom, login et mot de passe, comme vous le voyez le login et le mot de passe sont identiques. Je veux pouvoir modifer le mot de passe d'une ligne, voila ce que j'ai fait :

cat /emplacement du fichier | grep jdupond | awk -F ";" '{ print $5}' | sed s/jdupond/pass/ > /fichier provisoire

mais la le fichier provisoire ne contient que pass.

merci de votre aide

reduuxx

PS : je voudrais rester dans du shell sans perl ou autre si c'est possible
Configuration: Linux
Firefox 2.0.0.10

8 réponses

  1. Modérateur
    Salut,

    quoi, t'es allergique à Perl ;-DDDD ?!
    lami20j@debserv:~/trash$ cat fichier
    cinq1;Dupond;jean;jdupond;jdupond
    cinq1;valjean,jean;jvaljean,jvaljean
    lami20j@debserv:~/trash$ sed -r '1 s/(.*;)(.*)/\1pass/' fichier > temp
    lami20j@debserv:~/trash$ cat temp
    cinq1;Dupond;jean;jdupond;pass
    cinq1;valjean,jean;jvaljean,jvaljean

    0
    1. Modérateur
      Salut,
      $ cat plop
      cinq1;Dupond;jean;jdupond;jdupond
      cinq1;valjean,jean;jvaljean,jvaljean
      $ sed '/jdupond/ s//pass/2' plop
      cinq1;Dupond;jean;jdupond;pass
      cinq1;valjean,jean;jvaljean,jvaljean
      $
      ;-))
      0
      1. Contributeur
        hello
        awk -F ";" '/jdupond/ { $5="pass" ; print $0 }' < /emplacement du fichier > /fichier provisoire
        0
        1. Merci de votre aide rapide, mais vos réponses ne me satisfont pas pleinement. Je pense n'avoir pas été assez clair. Le fichier pourrait être :

          cinq1;jean;valjean;jvaljean;jvaljean
          cinq1;cosette;tenardier;ctenard;ctenard
          cinq1;louis;seize;lseize;toto

          la commande pour laquelle je demande de l'aide sera contenue dans un script et devra me permettre de changer les mot de passe.

          votre premiere proposition modifie toujours le premier mot de passe, si je met ctenard comme login, il me change celui de la premiere ligne.

          La seconde modifie toujours la deuxieme occurance, mais parfois c'est la premiere et ça peut etre la 3eme ou quatriemme.

          la troisieme me donne un fichier temporaire vide.

          je pense que grace à vous on est pas loin mais j'ai encore besoin d'un peu d'aide.

          merci

          Reduuxx
          0
          1. Modérateur
            Re-

            Ben on a fait selon ce que tu demandais dans ton 1er post et en fonction de ce que tu avais fourni comme explications...

            Bon pour faire ce que tu veux, il suffit de modifier un peu la syntaxe de "lami20j" (au choix):
            sed -r '/ctenard/ s/(.*;).*/\1pass/' fichier > temp
            sed -r '/tenardier/ s/(.*;).*/\1pass/' fichier > temp
            sed -r '/cosette/ s/(.*;).*/\1pass/' fichier > temp
            sed -r '2 s/(.*;).*/\1pass/' fichier > temp
            ;-))
            0
        2. Merci pour l'aide,

          il ne me reste qu'une petite amélioration.

          sed -r '/ctenard/ s/(.*;).*/\1pass/' fichier > temp

          ceci fonctionne mais comment inclure des variables aux lieu et place de ctenard et pass ?

          en mettant respectivement $login et $pass, le script ne fonctionne plus (je suis sur de mes variables car d'autres parties de mon script y font appel et fonctionnent)

          encore merci

          Reduuxx
          0
          1. Modérateur
            Salut,
            lami20j@debserv:~/trash$ cat fichier
            cinq1;Dupond;jean;jdupond;jdupond
            cinq1;valjean,jean;jvaljean,jvaljean
            lami20j@debserv:~/trash$ user=jdupond
            lami20j@debserv:~/trash$ password=pass
            lami20j@debserv:~/trash$ sed -r "/$user/ s/(.*;).*/\1$password/" fichier > temp
            lami20j@debserv:~/trash$ cat fichier
            cinq1;Dupond;jean;jdupond;jdupond
            cinq1;valjean,jean;jvaljean,jvaljean
            lami20j@debserv:~/trash$ cat temp
            cinq1;Dupond;jean;jdupond;pass
            cinq1;valjean,jean;jvaljean,jvaljean
            lami20j@debserv:~/trash$

            0
            1. Modérateur
              ;-))
              0
          2. Modérateur
            Alors au choix, soit tu double-quote l'expression entière :
            sed -r "/$ctenard/ s/(.*;).*/\1$pass/" fichier > temp
            soit avec des quotes simples :
            sed -r '/'"$ctenard"'/ s/(.*;).*/\1'"$pass"'/' fichier > temp
            ;-))
            0
            1. Bonjour

              gràce à votre aide plus de soucis.

              Si j'osais, je demanderai juste une dernière chose :

              pourriez vous expliciter les diférents éléments qui composent cette ligne de commande sed car j'avou ne pas tout saisir.

              Je ne sais pas comment mettre résolu mais si quelqu'un veut le faire, allez y.

              ENCORE MERCI

              Reduuxx
              0