pt sed acrescentar uma linha após um bloco

0

Em um diretório, tenho muitos site.ini.append.php (cerca de 100 arquivos).

Todos parecem:

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

No entanto, [block1] tem um número diferente de entradas, dependendo do arquivo. É a mesma coisa para os outros blocos.

Eu preciso adicionar uma nova linha no final de [block2] :

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

E não posso usar apenas o número da linha porque, como eu disse, os blocos têm entradas diferentes e [block2] pode ter 20 linhas em um arquivo e 10 em outro, etc.

Eu estava pensando em algo parecido com isso

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php

Mas isso não funciona, obviamente, porque /^\[block2\]$/,/^$/ não é um endereço.

Como faço isso (de preferência usando sed)?

UPDATE

Como explicado aqui , / ^ [block2] $ /, / ^ $ / é um endereço válido.

No entanto, nem a nem i corrige o problema para mim

sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

sed -n '/^\[block2\]$/,/^$/ i blabla[]=new_entry' path/to/one_of_the_site.ini.append.php 

Environment

$ sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
    
por smarber 10.01.2018 / 15:48

2 respostas

2
 sed  '/block2/,/^$/s/^$/blabla[]=new_entry\n/g' filename

O overeliner acima funciona bem. ele corresponde à linha entre o block2 e a newline e substitui o newline pelo blabla [] = new_entry \ n. Deixe-me saber para quaisquer problemas

saída

[block1]
blabla[]
blabla[]=blabla
...
blabla[]=blabla

[block2]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
blabla[]=new_entry

[block3]
blabla[]
blabla[]=blabla
...
blabla[]=blabla
    
por 10.01.2018 / 16:45
3

Seguindo a sugestão do @ don_crissti, isso parece funcionar no GNU sed e no BSD no meu Mac:

sed -e $'/^\\[block2\\]$/,/^$/ {/^$/i\\nnew line\n}' < input

No entanto, isso depende da linha vazia estar lá, não tenho certeza se o seu arquivo tem, se o bloco que estamos procurando é o último.

Precisamos de sed para obter uma nova linha real para iniciar e terminar o comando i , então usei o ANSI-C citando $'' para criar um (suportado por ksh / zsh / bash). Em um shell padrão, você terá que inserir manualmente um.

    
por 10.01.2018 / 16:08