Come sostituire la linea nel file con il modello con sed?


27

Sto leggendo molta documentazione su sed e sono ancora sconcertato sul mio caso d'uso particolare.

Voglio sostituire questa linea in un file conf con la mia linea:

Sostituisci questa riga:

#maxmemory <bytes>
con:
maxmemory 26gb

Questo è quello che ho provato:

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

Ottengo l'errore:

sed: -e espressione # 1, carattere 30: comando `s 'non terminato

Il che mi sorprende perché non so cosa significhi. Quindi la mia domanda è:

Come posso realizzare quello che voglio? Cosa significa questo errore? (così posso imparare da esso)

Risposte:



11

Infatti

L'errore indica che in assenza di virgolette, la shell utilizza spazi per separare gli argomenti. Lo spazio tra maxmemorye 26gbviene quindi considerato come la conclusione del primo argomento, che quindi manca di un terminale /quando si sedarriva a analizzare tale argomento come uno dei suoi comandi.

Mettere la tua regex tra virgolette singole, in modo che la shell non la divida in più argomenti e la passi sedcome un singolo argomento, risolve il problema:

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

mentre

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

lavori.

Spero possa aiutare.


1
Non è sedquello. È la shell che fa questo.
JdeBP

hai ragione, ovviamente, grazie per l'heads up :)
Sxilderik

3

Il tuo caso d'uso sarà risolto da questo comando.

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

5
Forse vuoi aggiungere una piccola spiegazione.
davidbaumann

2
-e era necessario per MacOS nel mio caso
cancerbero
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.