Linux Mint    Ubuntu    openSUSE    Asterisk    FreeBSD    Android    Nokia N900    Игры в Linux
 Linux Mint    Ubuntu     openSUSE     Asterisk     FreeBSD     Android     N900     Games

Изучаем Bash: Редактируем файл при помощи команды sed

Приветствую всех! :) Продолжу излогать свои мысли по поводу Bash и сегодня мы рассмотрим команду "sed". Всем, кто желает ознакомиться с прошлым материалом, читаем: Изучаем Bash. Перенаправление информации в файл.

Команда sed и ее принцип

Для начала давайте дадим этой команде определение:

Команда sed - расшифровывается как Stream Editor и представляес собой потоковый текстовый редактор. Поддерживает многие операции, такие как удалить, добавить и заменить. Все эти действия играют значительную роль, при использовании команды sed в скриптах.

Вот три основных действия, которые используются чаще всего:

  • d - удаление;
  • s - замена;
  • p - печать.

Синтаксис команды sed очень прост:

sed -[опция] '[строки в файле действие/заменяемое значение/на что заменяем]/' /home/xxx/file

Теперь давайте посмотрим, как дела обстоят на практике и заодно ответим на вопрос пользователя pdb3. Расмотрим действие на его вопросе :)

Итак, имеется файл updates.repo, который лежит по адресу: /etc/yum.repos.d/. Полный адрес: /etc/yum.repos.d/updates.repo.

В данном файле допустим первой строкой идет: enabled=0, что мы хотим заменить на enabled=1. Скрипт будет выглядеть так:

#!/bin/sh          # Указываем интерпритатор для наших команд

sed -i '1s/0/1/' /etc/yum.repos.d/updates.repo

Теперь давайте рассмотрим, что мы тут написали.

После команды sed идет опция -i, которая означает, что файл должен быть изменен в определенном месте, которое мы далее и указываем под цифрой "1" - первая строка.

Рядом с "1" стоит буква "s" - как я писал выше, это действие "замена". 0 - что заменяем, 1 - на что заменяем и далее полный адрес и сам файл, в котором мы это все проделываем :)

Нет ничего сложного.

Linux_man аватар

ну и команду:

man sed

еще никто не отменял, для подробного изучения :)

DIV аватар

Пора думаю bash учить :) Есть вопрос:

Можно ли заменить сразу на нескольких строках?

Linux_man аватар

без проблем! :)) скрипт будет выглядеть так:

sed -i '1s/0/1/' /etc/yum.repos.d/updates.repo
sed -i '2s/0/1/' /etc/yum.repos.d/updates.repo

первая цифра после sed -i это номер строчки, на какой заменить соответствующее значение.

electroz аватар

Спасибо! Это точно мне пригодится.

Linux_man аватар

всегда рад, рад что мой труд еще востребователен :))))

jekson аватар

присоединяюсь ) кто знает как ее найти в файле (например, в разных версиях он может оказаться на разных строчках), ну и в развитие темы - как найти файл с такой строчкой и потом найти строчку в файле ) Понимаю, что вопрос не легкий, но может кто знает

Linux_man аватар

знаю как, только что скрипт написал :) сейчас напишу статью подробную :) момент :)

Linux_man аватар

читаем это.

BAF аватар

Думаю через grep.
cat /etc/sysctl.conf | grep "net.ipv4.ip_forward" | sed 'd/#//' >> /etc/sysctl.conf_new
Могу реально быть не прав надо пробовать, но если мы щас прям тут начнем решать такие тривеальные проблемы, поверте плохо закончится.

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

Linux_man аватар

сделай так:

#!/bin/sh
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf

или:

#!/bin/bash
sed -i 's/#//g' /etc/sysctl.conf

во втором случае он удалит все символы #, которые в том файле :)