Intereting Posts
Какой подходящий Debian iso для рабочего стола? Возможно ли написать портативные служебные скрипты для управления демоном? Соответствие файлов в каталоге и проверка Как назначить переменные среды параллельно в bash получить доступный размер экрана после рассмотрения пространства, используемого в строке меню и панели запуска Создать виртуальный сетевой адаптер с собственным MAC и IP? Замена конца слова чем-то еще Как подождать подпроцесс, используемый для перенаправления ввода-вывода? Kali Linux показывает странную строку кода, используя команду Bash "set" Почему переменное расширение без $ работает в выражениях? Папки, созданные со сценарием, имеют неправильную измененную метку времени Отменить завершение, но только завершение, в zsh Как добавить пару ключей (общедоступный и закрытый) в список базы данных ядра, в которой содержится список доверенных ключей Как ядро ​​Linux может обращаться к назначенному initramfs / initrd? rsync с «файлами из» в подстановочных знаках

Вставьте строку после блока текста с помощью sed

У меня есть текстовый файл: file.conf

 ### Option: LogFile # Name of log file. # If not set, syslog is used. # # Mandatory: no # Default: # LogFile= ### Option: LogFileSize # Maximum size of log file in MB. # 0 - disable automatic log rotation. # # Mandatory: no # Range: 0-1024 # Default: # LogFileSize=1 

Я хочу найти строку, содержащую LogFile , пропустить последующие непустые строки и вставить новую строку с предопределенным содержимым непосредственно перед следующей пустой строкой.

И я попробовал:

 sed --posix -e '/\bLogFile\b/{:a;n;/^ *$/!ba;i\LogFile=/tmp/log1.log' -e '}' file.conf 

И это работает нормально, для тех блоков опций, за которыми следует пустая строка. Однако также возможно, что файл заканчивается пустой строкой, и в этом случае я хочу вставить новую строку в конец файла. В этом примере это произойдет, если я буду искать LogFileSize вместо LogFileSize .

Как я могу справиться с этим делом?

Простой возможностью было бы

 echo >>file.conf 

после выполнения sed я не уверен, что это возможно с чистым sed

У вас проблемы с inte, потому что вы используете i ("insert"), а не ("append"). i вставляю перед выбранной строкой, пока она добавляется после.

Вы также соответствуете блоку с помощью заголовка Option: LogFile а не более подходящей строки со значением по умолчанию ( # LogFile= ).


Использование GNU sed :

 $ sed '/^# LogFile=/a\LogFile=/tmp/log1.log' file.conf ### Option: LogFile # Name of log file. # If not set, syslog is used. # # Mandatory: no # Default: # LogFile= LogFile=/tmp/log1.log ### Option: LogFileSize # Maximum size of log file in MB. # 0 - disable automatic log rotation. # # Mandatory: no # Range: 0-1024 # Default: # LogFileSize=1 

Это также работает с LogFileSize :

 $ sed '/^# LogFileSize=/a\LogFileSize=512' file.conf ### Option: LogFile # Name of log file. # If not set, syslog is used. # # Mandatory: no # Default: # LogFile= ### Option: LogFileSize # Maximum size of log file in MB. # 0 - disable automatic log rotation. # # Mandatory: no # Range: 0-1024 # Default: # LogFileSize=1 LogFileSize=512 

Оба в один ход:

 $ sed -e '/^# LogFileSize=/a\LogFileSize=512' -e '/^# LogFile=/a\LogFile=/tmp/log1.log' file.conf