Substituir entre padrões que começam e terminam em linhas diferentes

3

Eu tenho um arquivo com o seguinte formato:

Whatever1
Whatever2
Whatever3
binaries=(
text1
bin2
ohhh3
)
Whatever4
Whatever5
Whatever6

Eu preciso substituir as linhas internas binaries=( e ) com uma saída de comando.

Eu posso escolher o seguinte bloco com um comando como sed -n -e '/binaries=(/,/)/p' filename :

binaries=(
text1
bin2
ohhh3
)

Ou ainda melhor com este awk '/binaries/,/)/{if(!/binaries|)/)print}' filename :

text1
bin2
ohhh3

Mas eu preciso reescrever o arquivo original e não sei como continuar.

    
por jherran 11.05.2015 / 20:10

2 respostas

4

Com o GNU sed :

sed '/binaries=(/,/)/{
       //!d
       /)/e uname
     }'

Substitua uname pelo seu comando.

    
por 11.05.2015 / 20:44
3

Eu faria isso no awk, por exemplo:

awk '
  f && /)/ { f=0 }
  !f
  !f && /binaries=\(/ { f=1 ; p=1 }
  p { system ("your_command") ; p=0 }
'

onde "your_command" definirá a substituição.

Explicação: O sinalizador f controlará a máquina de estado; se estiver definido, você está no bloco que será substituído. Com a correspondência do padrão inicial e final, o sinalizador é alterado de acordo. Enquanto você está no bloco, a chamada do sistema será executada; o sinalizador p é usado para imprimi-lo apenas uma vez.

Para substituir seu arquivo original, crie um novo arquivo e sobrescreva o original depois, ou use uma versão recente do GNU awk com a opção -i inplace .

    
por 11.05.2015 / 20:33