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)

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.


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

5
Mungkin Anda ingin menambahkan sedikit penjelasan.
davidbaumann

2
-e diperlukan untuk MacOS dalam kasus saya
cancerbero
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.