Forum Programmation.shell code retour sed ?

Posté par  .
Étiquettes : aucune
0
12
oct.
2009
Salut,

J'essaye de faire un "change or add" avec sed mais ça ne passe pas.

sed --in-place '/^MaxMem/ c\MaxMem = default' /tmp/test || echo "MaxMem = default" >> /tmp/test

mais si le sed ne trouve pas la ligne qui commence par MaxMem le echo n'est executé. Si il la trouve il la modifie correctement.
Ou est le problème ??
Le sed ne devrait pas retourner un code d'erreur si le search ne marche pas ?
  • # Par curiosité

    Posté par  . Évalué à 1.

    Bon, je pourrais le faire avec un grep && || ou avec des tests (ou awk, ou ...) mais j'aime bien savoir ;)
  • # Dans le principe même

    Posté par  . Évalué à 4.

    Le sed ne devrait pas retourner un code d'erreur si le search ne marche pas ?

    Qu'est ce qui te fait penser qu'un 'editeur de flux' devrait lever une erreur s'il n'y a rien à replacer dans le flux ? S'il ne trouve pas, il fait ce que tu lui as demandé et sort le texte sans remplacement.

    La chose qui te manque ici, c'est une variable de stats pour le nombre de remplacements.
  • # hmm

    Posté par  . Évalué à 2.

    Le sed ne devrait pas retourner un code d'erreur si le search ne marche pas ?

    si on en croit ton test, il semblerait que non ;-)

    Sed travaille par bloc, et là, tu cherches à lui faire faire une opération sur l'intégralité du fichier. Du coup, pour que sed puisse se charger de ça, il faut le faire travailler sur l'intégralité du fichier (,$).
    Ensuite, ça revient à écrire un script faisant une opération quand le fichier match, et une autre quand il ne matche pas.

    exemple :

    $ cat file1
    pattern1 val1
    pattern2 val2
    $ cat file2
    pattern2 val2
    $ cat tst.sed
    /pattern1/,$ {
     s/pattern1.*/pattern1 val1bis/
     b
    }
    /pattern1/,$! {
     $ a\
    pattern1 val1bis
     b
    }

    $ sed -f ./tst.sed file1
    pattern1 val1bis
    pattern2 val2
    $ sed -f ./tst.sed file2
    pattern2 val2
    pattern1 val1bis



    mais bon, là, c'était juste pour faire joujou avec sed (et je dis pas que c'est la meilleure syntaxe sed pour ce truc là ...), mais je serais toi, je ferais du grep -l pour décider si tu fais du remplacement ou de l'ajout
    • [^] # Re: hmm

      Posté par  . Évalué à 2.

      Ouaip, finalement j'ai fait un truc comme ça :

      grep -q MaxMem /tmp/test && sed --in-place '/^MaxMem/ c\MaxMem = default' /tmp/test || echo 'MaxMem = default' » /tmp/test

      mais c'est moins beau ;)
      • [^] # Re: hmm

        Posté par  . Évalué à 4.

        sinon, vu que tu ne réutilises pas du tout la valeur antérieure si jamais elle est présente, tu peux aussi faire systématiquement un delete de la ligne puis un add à la fin du fichier.

        ça ferait une plus jolie ligne que ta ligne actuelle, et ça serait plus lisible que mon sed :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.