Поиск и замена Linux в определенном разделе - PullRequest
0 голосов
/ 24 мая 2018

У меня есть набор файлов конфигурации, для которых мы хотим автоматизировать установку. Файлы содержат разделы, описывающие модули, например:

[section 1]
enable = no
...
...
[Section 2]
enable = no
...
...

Итак, в моем скрипте bash я сначала хочу найти [section], а затем найдите первый orcurrance для enable в этом разделе и измените его на yes.

Я искал sed для этого, но не могу понять, как заставить его изменять только Раздел 2а не раздел 1 (файлы конфигурации могут содержать 20-30 разделов, все из которых содержат строку с enable = no)

Я попытался найти af grep, чтобы сначала найти заголовок раздела, подсчитать номера строк, а затем использовать sedискать и заменять из льняных возвращений.

Это стало очень сложной и трудоемкой работой.

У кого-нибудь есть хорошая идея, как это сделать?

1 Ответ

0 голосов
/ 25 мая 2018

Уродливое решение, которое заменит только первую enable = строку в разделе, основано на разумном подходе.
Убедитесь, что каждый раздел находится на своей собственной строке.Когда это будет сделано, вы можете изменить первый enable= в этой строке.
Вы можете преобразовать разделы в одну строку, изменив новые строки маркером (я буду использовать \r).
Вы надеваетеВам не нужна одна длинная строка, поэтому поместите каждый новый раздел на новую строку, изменив [ на новую строку.После замены sed вы восстанавливаете [ и символы новой строки.

tr '\n[' '\r\n' < inputfile |
   sed '/^Section 2\]/ s/enable = [^\r]*/enable = yes/' | 
   tr '\n\r' '[\n'  

В этом решении есть ошибка: после tr в последней строке отсутствует \n, в результате чего sedигнорировать эту строку в поиске разделов.
Я не нашел хорошего способа исправить это, поэтому я хотел бы получить комментарии о том, как улучшить следующее уродливое исправление:

(tr '\n[' '\r\n' < inputfile ; echo) | 
   sed '/^Section 2\]/ s/enable = [^\r]*/enable = yes/;$ s/$-1/\r/' |
   tr '\n\r' '[\n' | sed '$ d'
...