Помогите разобраться с коммандой SED в BASH

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Serg7771
Сообщения: 2

Помогите разобраться с коммандой SED в BASH

Сообщение Serg7771 »

Всем привет!

Помогите пожалуста разобраться , как правильно подставить содержание переменных в комманду SED в bash.

Никак не получается у меня такой соббственно скриптик, и добавляющий свои строки:

Удаляет строки содержащие 127.0.0.1
sed '/^127/d' /etc/hosts

Определяем имя хоста и добавляем его 1 строкой в файл hosts, тоесть должно получится строка в файле
127.0.0.1 moy.hostname

Код: Выделить всё

hs=`hostname`
echo "FQDN is:" $hs
sed -i -e "1 s/^/127.0.0.1      /${hs}\n/;" /etc/hosts

И добавляем 2-строку с локальным IPv4 и FQDN именем
пример 10.10.10.26 moy.hostname

Код: Выделить всё

ip=`ip route get 8.8.8.8 | awk '{ print $7; exit }'`
echo "IP is:" $ip
sed -i -e '2 s/^/$/$ip      /$/$hs\n/;' /etc/hosts

По итогу в файле удаляются строки содержащие 127.0.0.1, а строки с переменными не добавляются (
Что я не так делаю?
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 903
ОС: debian, fedora (i3-wm)

Re: Помогите разобраться с коммандой SED в BASH

Сообщение olecya »

Считается плохим тоном редактировать системные файлы через sed без параметра к опции -i, так как подменяется редактируемый файл.
Могу посоветовать редактор ed с записанным кодом программы в формате heredoc:

Код: Выделить всё

#!/bin/bash
hs=$(hostname)
ip=$(ip route get 8.8.8.8 | cut -d' ' -f7)

echo -e "FQDN is:\t${hs}\nIP is:\t\t${ip}"

ed -s /etc/hosts << EOF
g/^127/d
1i
127.0.0.1 $hs
$ip $hs
.
w
q
EOF
Добавлено (00:11):
Serg7771
О я сразу забраковала ваш подход и напрасно. Довольно интересная ситуация. Если удаляешь первую строчку, то и подставить (substitution) в такой последовательности не получится без конвейера. А если сперва делаешь подстановку в начало первой строки то усложняется способ фильтрации первой строки для удаления которая фактически находится в одном буфере позади вставленной :rolleyes:
Добавлено (00:37):
Вот 2 варианта с insert отличающихся только способом переноса строки:

Код: Выделить всё

sed -i "1i \127.0.0.1 $hs\\n$ip $hs"$'\n/^127/d' /etc/hosts

Код: Выделить всё

sed -i "1i \127.0.0.1 $hs\\n$ip $hs
/^127/d" /etc/hosts
Спасибо сказали:
Serg7771
Сообщения: 2

Re: Помогите разобраться с коммандой SED в BASH

Сообщение Serg7771 »

Спасибо, буду пробовать.
Добавлено (09:09):
Огромное спасибо!
Работают оба варианта отлично! То что нужно.
olecya писала:
12.11.2024 23:23
sed -i "1i \127.0.0.1 $hs\\n$ip $hs"$'\n/^127/d' /etc/hosts
olecya писала:
12.11.2024 23:23
sed -i "1i \127.0.0.1 $hs\\n$ip $hs
/^127/d" /etc/hosts
Есть один неуанс, при повторном запуске скрипта, он изменяет и добавляет первые 2 строки как положено, а вот 3-ю старую оставляет)
Но это уже совсем другая история )

Код: Выделить всё

└─# cat /etc/hosts
127.0.0.1 new.host.name
192.168.28.128 new.host.name
192.168.28.128 raka.maka.foo  - запись от первого выполнения скрипта 

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20999
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Помогите разобраться с коммандой SED в BASH

Сообщение Bizdelnick »

Про команду i правильно сказали. Добавлю только, что лично я бы не стал править конфиги sed'ом в принципе, слишком много там мест, где можно ошибиться (скрипт, дающий желаемый результат с одним исходным конфигом, может изуродовать другой, если чего-то не учесть). augtool для этого прекрасная штука.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: