Найти и заменить строку между двумя разделителями
Как заменить строку между двумя разделителями?
Некоторые из ответов, которые я нашел, близки, но я думаю, что моя потребность немного сложнее.
Т.е. smb.conf
содержит пустую строку между акциями. Я хочу настроить таргетинг на общий ресурс, который хочу обновить. Первый разделитель - "[sharename]", а конечный разделитель может быть пустой строкой.
Я хочу найти и заменить "writable = yes" на "writable = no", который может быть неточно отформатирован из-за пробелов, но должен находиться между моими двумя разделителями.
4 ответа
Почти там, благодаря этому списку и http://fahdshariff.blogspot.com/2012/12/sed-mutli-line-replacement-between-two.html.
Я могу в командной строке заменить "доступное для записи" на "# доступное для записи" и могу сделать это независимо от настройки Y/N, позже я добавлю еще одну строку.
sed '/\[${share_name}\]/,/^$/{/\[${share_name}\]/n;/^$/!{s/writeable/\#writeable/g}}' \
< ${input_file} \
> /tmp/parse-smb.tmp
Пока это работает в командной строке с "!" сбежал "!" это не работает в файле сценария / bin / sh. Я должен убрать побег, но тогда курок не сработает.
Тонкости оболочки.
Ах, "!" было хорошо, это была ошибка переменной "имя_папки" для перевода. Используйте двойные, а не одинарные кавычки в этой команде.
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
Я бы рассмотрел 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