Como substituir a linha no arquivo pelo padrão com sed?

10

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

Eu quero substituir esta linha em um arquivo conf com minha própria linha:

Substitua esta linha:

#maxmemory <bytes>
com:
maxmemory 26gb

Isso é o que eu tentei:

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

Eu recebo o erro:

sed: -e expression #1, char 30: unterminated 's' command

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

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

    
por Henley Chiu 02.03.2014 / 00:07

2 respostas

12

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

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

    
por 13.12.2015 / 18:04
8

De fato

O erro significa que, na ausência de aspas, seu shell usa espaços para separar argumentos. O espaço entre maxmemory e 26gb é, portanto, considerado como terminando o primeiro argumento, que, portanto, não possui um terminal / quando sed trata de analisar esse argumento como um de seus comandos.

Colocando o seu regex entre aspas simples, para que seu shell não o divida em vários argumentos e o entregue a sed como 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

funciona.

Espero que ajude.

    
por 02.03.2014 / 00:49