Como substituir linha em arquivo com padrão com sed?

26

Estou lendo muita documentação sobre o sed e ainda estou perplexo no meu caso de uso específico.

Quero substituir esta linha em um arquivo conf por minha própria linha:

Substitua esta linha:

#maxmemory <bytes>
com:
maxmemory 26gb

Isto é o que eu tentei:

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

Eu recebo o erro:

expressão sed: -e # 1, caractere 30: comando `s 'não terminado

O que me surpreende, porque não sei o que isso significa. Então, minha pergunta é:

Como posso realizar o que quero? O que significa esse erro? (para que eu possa aprender com isso)

Henley Chiu
fonte

Respostas:

26

Você esqueceu -i. A modificação deve ser feita no local:

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

Fantasma
fonte
11

De fato

O erro significa que, na ausência de aspas, seu shell usa espaços para separar argumentos. O espaço entre maxmemorye 26gbé, portanto, considerado como finalizador do primeiro argumento, que, portanto, carece de um terminal /quando se sedtrata de analisar esse argumento como um de seus comandos.

Colocar seu regex entre aspas simples, para que seu shell não o divida em vários argumentos e o entregue sedcomo um único argumento, resolve o problema:

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

enquanto

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

trabalho.

Espero que ajude.

Sxilderik
fonte
1
Não é isso sedque faz isso. É a concha que faz isso.
#
você está certo, é claro, graças a cabeça para cima :)
Sxilderik
3

Seu caso de uso será resolvido por este comando.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Indian Velumani
fonte
5
Talvez você queira adicionar uma pequena explicação.
Davidbaumann
2
-e era necessário para MacOS no meu caso
Cancerbero