Як замінити рядок у файлі на шаблон із sed?


28

Я читаю багато документації на sed, і до сих пір натрапляю на свій конкретний випадок використання.

Я хочу замінити цей рядок у конф-файлі власним рядком:

Замініть цей рядок:

#maxmemory <байти>
з:
maxmemory 26gb

Це те, що я спробував:

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

Я отримую помилку:

sed: -e вираз №1, char 30: незакінчена команда `s '

Що мене натикає, бо я не знаю, що це означає. Отже, моє питання:

Як я можу досягти того, що хочу? Що означає ця помилка? (тому я можу навчитися на цьому)

Відповіді:


29

Ви забули -и. Потрібно внести зміни:

$ 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

працює.

Сподіваюся, що це допомагає.


1
Це не sedтак. Це оболонка, яка робить це.
JdeBP

Ви маєте рацію, звичайно, дякую за голову :)
Sxilderik

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.