Как заменить строку между двумя разделителями?
Некоторые ответы, которые я нашел, близки, но я думаю, что моя потребность немного сложнее.
Т.е. 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