web-dev-qa-db-fra.com

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

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

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

Remplacez cette ligne:

#maxmemory <octets>
maxememory 26gb

C'est ce que j'ai essayé:

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

Je reçois l'erreur:

sed: -e expression # 1, char 30: commande `s 'sans fin

Ce qui me stoppe parce que je ne sais pas ce que cela signifie. Donc ma question est:

Comment puis-je accomplir ce que je veux? Qu'est-ce que cette erreur signifie? (pour que je puisse en tirer des leçons)

16
Henley Chiu

Vous avez oublié -i. Les modifications doivent être effectuées sur place:

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

20
Phantom

Effectivement

L'erreur signifie qu'en l'absence de guillemets, votre shell utilise des espaces pour séparer les arguments. L'espace entre maxmemory et 26gb est donc considéré comme terminant le premier argument, auquel manque donc un terminal / lorsque sed vient analyser cet argument comme l'une de ses commandes.

Placer votre expression rationnelle entre guillemets simples, de sorte que votre shell ne la divise pas en plusieurs arguments et ne le transmet pas à sed sous la forme d'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.

9
Sxilderik

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

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
0
Indian Velumani