web-dev-qa-db-fra.com

Remplacer ou ajouter une chaîne à un fichier

Je sais que sed peut remplacer un morceau de chaîne dans un fichier texte comme ceci:

sed -i 's/oldstring/newstring/g' test.txt

Mais, comment puis-je remplacer la ligne si elle existe et l'ajouter automatiquement sur une nouvelle ligne si elle n'existe pas?

Merci.

Edit: Merci pour vos réponses. Selon les demandes sur vos commentaires et réponses, voici plus de détails:

  • Je veux vérifier l'existence de l'ancienne chaîne et la remplacer par la nouvelle si elle existe.
  • Je veux ajouter la nouvelle chaîne dans une nouvelle ligne à la fin du fichier txt si l'ancienne chaîne n'existe pas
  • S'il y a plusieurs occurrences de la même chaîne, il s'agirait d'une erreur car il s'agirait d'un fichier de configuration. Les autres occurrences peuvent être supprimées après avoir remplacé la première occurrence.
4
Josh

Une façon de faire cela consiste à ajouter grep dans l'équation. Commencez par vérifier si le fichier contient la chaîne avec un nom grep rapide, puis ajoutez-le ou remplacez-le en conséquence:

grep -q string file && 
    sed -i 's/string/newstring/' file || echo "newstring" >> file

Ce qui précède est un moyen d'écrire:

if grep -q string file; then 
    sed -i 's/string/newstring/' file
else
    echo "newstring" >> file
fi

Personnellement, j’utiliserais plutôt Perl pour cela. Il suffit de lire le fichier une fois et de définir une variable sur 1 si la substitution a été effectuée. Puis, à la fin, ajoutez la chaîne si la variable n'est pas 1:

Perl -lpe '$i=1 if s/oldstring/newstring/; 
           END{print "newstring" if $i!=1;}' file > tmpfile && mv tmpfile file
9
terdon

Cela devrait atteindre ce qui est requis:

grep -q "oldstring" test.txt
if [ $? -eq 1 ]; then
    echo "newstring" >> test.txt
else
    sed -i 's/oldstring/newstring/g' test.txt
fi
2
Sadi

Utiliser AWK:

<<<"$(<in)" awk '{if(/foo/){x=sub(/foo/, "bar", $0)};print}END{if(x!=1){print "bar"}}' >in
% cat in1
string oldstring string
% cat in2
string foo string
% <<<"$(<in1)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in1
user@user-X550CL ~/tmp % cat in1
string newstring string
% <<<"$(<in2)" awk '{if(/oldstring/){x=sub(/oldstring/, "newstring", $0)};print}END{if(x!=1){print "newstring"}}' >in2
% cat in2
string foo string
newstring
1
kos