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:
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
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
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