Использование sed, чтобы найти строку и заменить эту строку, но игнорировать закомментированные строки - PullRequest
0 голосов
/ 31 октября 2019

Я использую 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 / и это приводит к сбою всей замены.

1 Ответ

0 голосов
/ 01 ноября 2019

Для файла, подобного этому:

# server string = is the equivalent of the NT Description field
   server string = 145000web SAMBA1
#server string = is the equivalent of the NT Description field
       server string = 999999web2 SAMBA2
#   server string = another comment
#          server string = more comments
server string = some value SAMBA3
 server string = some value SAMBA4

и с такой переменной

echo $variable
111111www5

Это будет работать с gnu sed, но пробел не сохраняется:

sed 's/^[^#]*server string \=.*/server string = '"$variable"' SAMBA/g' file
# server string = is the equivalent of the NT Description field
server string = 111111www5 SAMBA
#server string = is the equivalent of the NT Description field
server string = 111111www5 SAMBA
#   server string = another comment
#          server string = more comments
server string = 111111www5 SAMBA
server string = 111111www5 SAMBA

Чтобы сохранить пустое пространство, вы можете использовать что-то вроде этого:

sed -r 's/(^[^#]*)server string \=.*/\1server string = '"$variable"' SAMBA/g' file

или даже

sed -r 's/(^[^#]*server string \=).*/\1'"$variable"' SAMBA/g' file

PS: у меня есть пропущенный переключатель -i специально. Вы можете добавить его, когда будете довольны результатами.

...