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)

Réponses:



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.


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

5
Vous souhaitez peut-être ajouter une petite explication.
davidbaumann

2
-e était nécessaire pour MacOS dans mon cas
cancerbero
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.