Wie ersetze ich die Zeile in der Datei durch das Muster mit sed?

28

Ich lese eine Menge Dokumentation über sed und bin immer noch ratlos über meinen speziellen Anwendungsfall.

Ich möchte diese Zeile in einer conf-Datei durch meine eigene Zeile ersetzen:

Ersetzen Sie diese Zeile:

#maxmemory <Bytes>
mit:
maxmemory 26gb

Folgendes habe ich versucht:

sed s / maxmemory. * Bytes. * / maxmemory 26 GB / /etc/redis/redis.conf

Ich bekomme den Fehler:

sed: -e Ausdruck # 1, char 30: nicht abgeschlossener `s'-Befehl

Was mich verblüfft, weil ich nicht weiß, was das bedeutet. Meine Frage lautet also:

Wie kann ich erreichen, was ich will? Was bedeutet dieser Fehler? (damit ich daraus lernen kann)

Henley Chiu
quelle

Antworten:

11

Tatsächlich

Der Fehler bedeutet, dass Ihre Shell ohne Anführungszeichen Leerzeichen verwendet, um Argumente zu trennen. Der Abstand zwischen maxmemoryund 26gbwird daher als Beendigung des ersten Arguments betrachtet, dem daher ein Terminal fehlt, /wenn seddieses Argument als einer seiner Befehle analysiert werden soll.

Wenn Sie Ihren regulären Ausdruck zwischen einfache Anführungszeichen setzen, damit Ihre Shell ihn nicht in mehrere Argumente aufteilt und sedals ein einziges Argument übergibt , wird das Problem gelöst:

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

während

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

funktioniert.

Ich hoffe, das hilft.

Sxilderik
quelle
1
Das macht das nicht sed. Es ist die Shell , die das macht.
JdeBP
Sie haben natürlich Recht, danke für das Heads-up :)
Sxilderik
3

Ihr Anwendungsfall wird mit diesem Befehl gelöst.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Indischer Velumani
quelle
5
Vielleicht möchten Sie eine kleine Erklärung hinzufügen.
Davidbaumann
2
-e wurde für MacOS in meinem Fall benötigt
Cancerbero