Comment remplacer une ligne dans un fichier par un motif avec sed?

27

Je lis beaucoup de documentation sur sed, et je suis toujours perplexe sur mon cas d'utilisation particulier.

Je veux remplacer cette ligne dans un fichier conf par ma propre ligne:

Remplacez cette ligne:

#maxmemory <bytes>
avec:
maxmemory 26gb

Voici ce que j'ai essayé:

sed s / maxmemory. * octets. * / maxmemory 26 Go / /etc/redis/redis.conf

Je reçois l'erreur:

sed: -e expression # 1, char 30: commande `s 'non terminée

Ce qui me bloque parce que je ne sais pas ce que cela signifie. Ma question est donc:

Comment puis-je accomplir ce que je veux? Que signifie cette erreur? (donc je peux en tirer des leçons)

Henley Chiu
la source

Réponses:

28

Vous avez oublié -i. La modification doit être effectuée sur place:

$ sed -i 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt

Fantôme
la source
Et si vous avez des barres obliques dans vos chaînes, vous devez utiliser un autre caractère délimiteur à la place de /, comme @ou |. Voir ici: stackoverflow.com/a/9366940/4561887 et ici: unix.stackexchange.com/a/259087/114401 .
Gabriel Staples
11

En effet

L'erreur signifie qu'en l'absence de guillemets, votre shell utilise des espaces pour séparer les arguments. L'espace entre maxmemoryet 26gbest donc considéré comme terminant le premier argument, qui manque donc de terminal /lorsqu'il seds'agit d'analyser cet argument comme l'une de ses commandes.

Mettre votre regex entre guillemets simples, afin que votre shell ne le divise pas en plusieurs arguments et ne le remette pas seden un seul argument, résout le problème:

$ sed s/maxmemory.*/maxmemory 26gb/ /some/file/some/where.txt
sed: -e expression n°1, caractère 23: commande `s' inachevée

tandis que

$ sed 's/maxmemory.*/maxmemory 26gb/' /some/file/some/where.txt

travaux.

J'espère que cela pourra aider.

Sxilderik
la source
1
Ce n'est pas sedça qui fait ça. C'est la coquille qui fait ça.
JdeBP
vous avez raison, bien sûr, merci pour votre
attention
3

Votre cas d'utilisation sera résolu par cette commande.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Velumani indien
la source
5
Vous souhaitez peut-être ajouter une petite explication.
davidbaumann
2
-e était nécessaire pour MacOS dans mon cas
cancerbero