Em um diretório, tenho muitos site.ini.append.php
(cerca de 100 arquivos).
Todos eles se parecem com:
[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 disse, os blocos possuem entradas diferentes, [block2]
podendo ter 20 linhas em um arquivo, e 10 em outro etc...
eu estava pensando em algo assim
sed -n '/^\[block2\]$/,/^$/ a blabla[]=new_entry' path/to/one_of_the_site.ini.append.php
Mas não funciona, obviamente, porque /^\[block2\]$/,/^$/
não é um endereço.
Como faço isso (de preferência usando sed)?
ATUALIZAR
Conforme explicado aqui , /^[block2]$/,/^$/ é um endereço válido.
No entanto, nem a nem i resolvem 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
Meio Ambiente
$ 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.
Seguindo a sugestão de @don_crissti, isso parece funcionar no GNU sed e no BSD no meu Mac:
No entanto, depende da linha vazia estar lá, não tenho certeza se seu arquivo a possui se o bloco que procuramos é o último.
Precisamos do sed para obter uma nova linha real para iniciar e encerrar o
i
comando, então usei as citações ANSI-C$''
para fazer uma (suportada por ksh/zsh/bash). Em um shell padrão, você terá que inserir um manualmente.Acima, o oneliner funciona bem. Ele corresponde à linha entre block2 e newline e, em seguida, substitui newline por blabla[]=new_entry\n. Avise-me sobre quaisquer problemas
resultado