Inserir uma linha depois de um bloco de texto com sed

2

Eu tenho um arquivo de texto: 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

Eu quero procurar por uma linha contendo LogFile , pular linhas não-brancas subseqüentes e inserir uma nova linha com conteúdo predefinido antes da próxima linha em branco.

E eu tentei:

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

E isso está funcionando bem, para os blocos de opção que são seguidos por uma linha em branco. No entanto, também é possível que o arquivo seja finalizado sem linha em branco. Nesse caso, quero inserir a nova linha no final do arquivo. Neste exemplo, isso aconteceria se eu estivesse procurando LogFileSize em vez de LogFile .

Como posso lidar com este caso?

    
por donul 12.02.2014 / 08:15

2 respostas

0

Uma possibilidade simples seria

echo >>file.conf

após sed executar, não tenho certeza de que é possível com sed

puro     
por 12.02.2014 / 09:43
0

Você está executando problemas inte porque está usando i ("insert") em vez de a ("append"). i insere antes de uma linha selecionada enquanto a acrescenta após.

Você também está correspondendo ao bloco pelo cabeçalho Option: LogFile em vez da linha mais apropriadamente posicionada com o valor padrão ( # LogFile= ).

Usando o 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

Isso também funciona com 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

Ambos de uma só vez:

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