Jak zamienić wiersz w pliku wzorkiem na sed?

28

Czytam dużo dokumentacji na temat sed i wciąż jestem zakłopotany moim szczególnym przypadkiem użycia.

Chcę zastąpić tę linię w pliku conf własną linią:

Zamień ten wiersz:

#maxmemory <bajty>
z:
maxmemory 26 gb

Oto, co próbowałem:

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

Dostaję błąd:

sed: -e wyrażenie # 1, char 30: niezakończone polecenie `s '

Co mnie zaskakuje, bo nie wiem, co to znaczy. Więc moje pytanie brzmi:

Jak mogę osiągnąć to, czego chcę? Co oznacza ten błąd? (abym mógł się z tego nauczyć)

Henley Chiu
źródło

Odpowiedzi:

11

W rzeczy samej

Błąd oznacza, że ​​przy braku cudzysłowów twoja powłoka używa spacji do oddzielania argumentów. Przestrzeń pomiędzy maxmemoryi 26gbjest zatem uważana za kończącą pierwszy argument, który w związku z tym nie ma terminala, /jeśli sedchodzi o parsowanie tego argumentu jako jednego z jego poleceń.

Umieszczenie wyrażenia regularnego między pojedynczymi cudzysłowami, aby powłoka nie podzieliła go na wiele argumentów i nie przekazała go sedjako jednego argumentu, rozwiązuje problem:

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

podczas

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

Pracuje.

Mam nadzieję, że to pomaga.

Sxilderik
źródło
1
To nie sedtak. To powłoka to robi.
JdeBP
oczywiście masz rację, dziękuję za heads-upa :)
Sxilderik
3

Twój przypadek użycia zostanie rozwiązany przez to polecenie.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Indianin Velumani
źródło
5
Może chcesz dodać małe wyjaśnienie.
davidbaumann
2
-e było potrzebne dla MacOS w moim przypadku
cancerbero