Bagaimana cara mengganti baris dalam file dengan pola dengan sed?

27

Saya membaca banyak dokumentasi tentang sed, dan saya masih bingung dengan kasus penggunaan khusus saya.

Saya ingin mengganti baris ini dalam file conf dengan baris saya sendiri:

Ganti baris ini:

#maxmemory <bytes>
dengan:
maxmemory 26gb

Inilah yang saya coba:

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

Saya mendapatkan kesalahan:

sed: -e ekspresi # 1, char 30: perintah `s 'yang tidak dikalahkan

Yang mengejutkan saya karena saya tidak tahu apa artinya itu. Jadi pertanyaan saya adalah:

Bagaimana saya bisa mencapai apa yang saya inginkan? Apa artinya kesalahan itu? (jadi saya bisa belajar darinya)

Henley Chiu
sumber

Jawaban:

11

Memang

Kesalahan berarti bahwa tanpa adanya tanda kutip, shell Anda menggunakan spasi untuk memisahkan argumen. Ruang antara maxmemorydan 26gbdengan demikian dianggap sebagai mengakhiri argumen pertama, yang dengan demikian tidak memiliki terminal /ketika sedmem-parsing argumen itu sebagai salah satu perintahnya.

Menempatkan regex Anda di antara tanda kutip tunggal, sehingga shell Anda tidak membaginya menjadi beberapa argumen dan menjadikannya sedsebagai satu argumen tunggal, menyelesaikan masalah:

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

sementara

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

bekerja.

Semoga itu bisa membantu.

Sxilderik
sumber
1
Bukan itu sedyang melakukan ini. Ini adalah shell yang melakukan hal ini.
JdeBP
Anda benar, tentu saja, terima kasih atas perhatiannya :)
Sxilderik
3

Kasing penggunaan Anda akan diselesaikan dengan perintah ini.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Velumani India
sumber
5
Mungkin Anda ingin menambahkan sedikit penjelasan.
davidbaumann
2
-e diperlukan untuk MacOS dalam kasus saya
cancerbero