Как заменить строку в файле рисунком с помощью sed?

27

Я читаю много документации по sed, и все еще нахожусь в тупике в моем конкретном случае использования.

Я хочу заменить эту строку в файле conf моей собственной строкой:

Заменить эту строку:

#maxmemory <bytes>
с:
максимальная память 26 ГБ

Вот что я попробовал:

sed s / maxmemory. * байт. * / maxmemory 26 ГБ / /etc/redis/redis.conf

Я получаю ошибку:

sed: -e выражение # 1, char 30: неопределенная команда `s '

Что меня озадачивает, потому что я не знаю, что это значит. Итак, мой вопрос:

Как я могу выполнить то, что я хочу? Что означает эта ошибка? (чтобы я мог учиться на этом)

Хенли Чиу
источник

Ответы:

27

Вы забыли -i. Модификация должна быть сделана на месте:

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

фантом
источник
И если у вас есть косые черты в строках, вы должны использовать другой символ разделителя вместо /, например, @или |. Смотрите здесь: stackoverflow.com/a/9366940/4561887 и здесь: unix.stackexchange.com/a/259087/114401 .
Габриэль Стейплс
11

В самом деле

Ошибка означает, что при отсутствии кавычек ваша оболочка использует пробелы для разделения аргументов. Пространство между maxmemoryи 26gb, таким образом, рассматривается как завершающий первый аргумент, который, таким образом, не имеет терминала, /когда он sedанализирует этот аргумент как одну из его команд.

Помещение вашего регулярного выражения в одинарные кавычки, чтобы ваша оболочка не разделяла его на несколько аргументов и передавала его sedкак один единственный аргумент, решает проблему:

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

пока

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

работает.

Надеюсь, это поможет.

Sxilderik
источник
1
Это не sedто, что делает это. Это оболочка, которая делает это.
JdeBP
Вы правы, конечно, спасибо за голову :)
Sxilderik
3

Ваш вариант использования будет решен этой командой.

sed -i -e 's/#maxmemory.*/maxmemory 26gb/g' /etc/redis/redis.conf
Индийский велумани
источник
5
Может быть, вы хотите добавить небольшое объяснение.
Давидбауман
2
-e в моем случае понадобился для MacOS
Cancebero