How to replace line in file with pattern with sed?

144,128

Solution 1

You have forgot -i. Modification should be made in place :

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

Solution 2

Indeed

The error means that in the absence of quotes, your shell uses spaces to separate arguments. The space between maxmemory and 26gb is thus considered as terminating the first argument, which thus lacks a terminal / when sed comes to parse that argument as one of its commands.

Putting your regex between single quotes, so that your shell doesn't split it into multiple arguments and hands it to sed as one single argument, solves the problem:

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

while

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

works.

Hope that helps.

Solution 3

Your use case will be solved by this command.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Share:
144,128

Related videos on Youtube

Henley
Author by

Henley

I like to work on hard technical problems.

Updated on September 18, 2022

Comments

  • Henley
    Henley over 1 year

    I'm reading a lot of documentation on sed, and am still stumped on my particular use case.

    I want to replace this line in a conf file with my own line:

    Replace this line:

    #maxmemory <bytes>
    with:
    maxmemory 26gb

    This is what I tried:

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

    I get the error:

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

    Which stumps me because I don't know what that means. So my question is:

    How can I accomplish what I want? What does that error mean? (so I can learn from it)

  • JdeBP
    JdeBP about 10 years
    It's not sed that does this. It's the shell that does this.
  • Sxilderik
    Sxilderik about 10 years
    you're right, of course, thanks for the heads up :)
  • davidbaumann
    davidbaumann about 5 years
    Maybe you want to add a small explanation.
  • cancerbero
    cancerbero over 4 years
    -e was needed for MacOS in my case
  • Gabriel Staples
    Gabriel Staples about 4 years
    And if you have slashes in your strings, you must use another delimiter character instead of /, such as @ or |. See here: stackoverflow.com/a/9366940/4561887 and here: unix.stackexchange.com/a/259087/114401.
  • f4f
    f4f over 3 years
    Concise and precisely what one will typically need. Thanks a lot, @Phantom.