Назад | Перейти на главную страницу

Найти и заменить строку между двумя разделителями

Как заменить строку между двумя разделителями?

Некоторые ответы, которые я нашел, близки, но я думаю, что моя потребность немного сложнее.

Т.е. smb.conf содержит пустую строку между долями. Я хочу настроить таргетинг на общий ресурс, который хочу обновить. Первый разделитель - «[имя_средства]», а конечный разделитель может быть пустой строкой.

Я хочу найти и заменить «Writable = yes» на «Writable = no», который может быть отформатирован неточно из-за пробелов, но должен находиться между двумя моими разделителями.

Ах, "!" все в порядке, это была ошибка перевода переменной "share_name". Используйте в этой команде двойные, а не одинарные кавычки.

sed "/\${share_name}\]/,/^$/{/[${share_name}\]/n;/^$/!s/writeable/\#writeable/g}}" \
< ${input_file} \
> /tmp/parse-smb.tmp

Должен был понять, что в следующей строке также используются двойные кавычки.

sed -i "s/\[${share_name}\]/\[${share_name}\]\n\thosts allow = 10.50.157.0\/24 \n\twriteable = no/" \
/tmp/parse-smb.tmp

Почти готово, благодаря этому списку и http://fahdshariff.blogspot.com/2012/12/sed-mutli-line-replacement-between-two.html.

Я могу в командной строке заменить «writeable» на «# writeable» и могу сделать это безотносительно к настройке Y / N, позже я вставлю другую строку.

sed '/\[${share_name}\]/,/^$/{/\[${share_name}\]/n;/^$/!{s/writeable/\#writeable/g}}' \
< ${input_file} \
> /tmp/parse-smb.tmp

Хотя это работает в командной строке с "!" ускользнул "!" он не работает в файле сценария / bin / sh. Мне нужно убрать побег, но тогда спусковой крючок не срабатывает.

Тонкости оболочки.

Я бы рассмотрел perl: непроверенный

perl -00 -pe '/^\[your_share_name\]/ and s/writable\s*=\s*\Kyes/no/si' smb.conf

Я думаю, что это работа для perl (или python, если вам так хочется).

iMac$ cat ./replace.pl
#!/usr/bin/perl

while (<>) {
    if (/^\n/) { $replace = 0; }
    if (/\[share3\]/) { $replace = 1; }
    print unless /writable/;
    if (/writable/) {
    if ($replace == 1) {
        print "  writable = no\n";
    }
    else {
        print;
    }
    }
}
iMac$ cat smb.conf 
[share1]
  writable = yes
  user = anonymous
  host = remote

[share2]
  writable = yes
  user = anonymous
  host = remote

[share3]
  writable = yes
  user = anonymous
  host = remote

[share4]
  writable = yes
  user = anonymous
  host = remote

[share5]
  writable = yes
  user = anonymous
  host = remote
iMac$ cat smb.conf | ./replace.pl
[share1]
  writable = yes
  user = anonymous
  host = remote

[share2]
  writable = yes
  user = anonymous
  host = remote

[share3]
  writable = no
  user = anonymous
  host = remote

[share4]
  writable = yes
  user = anonymous
  host = remote

[share5]
  writable = yes
  user = anonymous
  host = remote