Я использую sed для редактирования моих файлов /etc/samba/smb.conf на 300 виртуальных машинах Linux с различными конфигурациями.
Я просто хочу найти строку "server string =", которая не закомментирована изамените всю эту строку на «server string = $ VARIABLE SAMBA», которая получает VARIABLE из цикла do-while при чтении моего списка серверов.
Итак, пытаясь выполнить 3 вещи 1 - найдите «server string =» и заменитеэта строка со строкой сервера = $ VARIABLE "
sed -i '/server string \=/c\server string = '$VARIABLE' SAMBA' /etc/samba/smb.conf
Вышеприведенная команда работает, но, к сожалению, на многих моих машинах все еще есть пояснительные комментарии, в которых также есть" строка сервера = ", и я заметил строку" строка сервера = "некомментированный не всегда в столбце 1 и часто помещается или вставляется в более старые файлы, поэтому я не могу просто предварять его с помощью ^.
Это команда, с которой я столкнулся, читая другие потоки в стекепереполнение и объединение замены синтаксиса строки (\ c) с игнорированием синтаксиса закомментированных строк (^ # /! /), но это не радует. Я добавил \ v для tон «Магическая замена» из другого поста, поскольку выяснение того, что именно нужно избежать, ускользает от меня. (Я думал, что ^ и нужное = сбежали)
sed -i -e '/^#/!s/\vserver string =/c\server string = '$VARIABLE' SAMBA/g' /etc/samba/smb.conf
Эта строка, кажется, теперь вообще ничего для меня не делает ... без замены, без замены переменной.
Если яgrep для "server string =" Я вижу это: (Нет, я не могу вручную изменить все 308 машин одинаково)
# server string = is the equivalent of the NT Description field
server string = 145000web SAMBA ---- THIS LINE WAS NOT REPLACED ----
Я на этом сошел с ума.
-----------------------------
Используя ссылку, указанную в первом комментарии, я получаю это:
sed '/^#/!s/test/TEST/g' file.txt - This command works as expected ignoring the commented out lines and replacing the text.
К сожалению, попытка добавить в c \ для замены всей строки идет не так:
cTEST
# test
# test
cTEST
a cTEST to find cTEST
3 строки без комментариев должны просто сказать ТЕСТ, который я пытался использовать с помощьюc \ после s / и это приводит к сбою всей замены.