Реализация в вопросе проблематична и неэффективна.
Вы читаете файл построчно и создаете команду sed
из входной строки. Эта команда может вести себя неожиданно, если строка содержит какие-либо специальные символы регулярных выражений, такие как .^$[]
и т. д.
Затем вы обрабатываете весь файл с помощью sed
один раз для каждой строки, которую необходимо изменить. Вы можете обрабатывать каждую строку по отдельности вместо многократной обработки всего входного файла.
Я предлагаю использовать awk
для обработки файла и использовать оболочку сценария оболочки, которая обрабатывает временный выходной файл.(awk
не поддерживает редактирование места -, например sed
или perl
.)
#!/bin/bash
filename='myconfigfile.conf'
temp=${filename}.temp
awk '/^[^ ]/ { comment=0 } # stop commenting if line starts with non-space.
/^someconfig/ { comment=1 } # start commenting if line starts with "someconfig"
comment {$0 = "#" $0} # prepend "#" to whole line ($0)
{ print }' $filename > $temp && mv -f $temp $filename || rm -f $temp
При желании можно добавить правило
/^[ ]*$/ { comment=0 } # stop commenting on empty line or space only
, чтобы прекратить комментирование, когда появляется пустая строка или строка, содержащая только пробелы.
Обратите внимание, что [^ ]
и [ ]
содержат один пробел и один символ табуляции.
Сценарий не обнаруживает какие-либо отступы. Он просто добавляет "#"
к тому, что находится в строке (, включая отступ ), пока comment
не равен нулю.