Discussion:
[shell-script] Adicionar uma linha abaixo de outra, apenas de um bloco de texto
andrelucio.fc@yahoo.com [shell-script]
2016-11-04 18:06:17 UTC
Permalink
Olá, senhores.

Preciso adicionar uma linha abaixo de outra, mas apenas de um bloco de texto. Segue abaixo os blocos de texto que preciso editar para que a explicação se torne melhor:


### BLOCO DE TEXTO 1 ###


config wifi-iface
option device 'radio0'
option mode 'ap'
option iapp_interface 'company'
option ssid 'wifi'
option network 'wan'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:79:18:FF:88:BF'


### FIM DO BLOCO DE TEXTO 1 ###



### BLOCO DE TEXTO 2 ###



config wifi-iface
option device 'radio1'
option mode 'ap'
option iapp_interface 'company2'
option ssid 'wifi2'
option network 'wan2'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:7D:18:4F:99:7F'


### FIM DO BLOCO DE TEXTO 2 ###



Preciso adicionar uma linha ou várias linhas, abaixo da linha que contém o texto "list maclist '0C:7D:18:4F:99:7F'", mas apenas do bloco de texto que contém o parametro indicado, por exemplo o parâmetro: "option device 'radio1'" adicionaria apenas o texto fornecido no bloco de texto 2, conforme os blocos de texto acima. Eu conseguir adicionar um texto abaixo de outra com o sed sem problemas, o meu único problema é acrescentar apenas no bloco de texto que contém o parâmetro indicado. Alguém poderia me ajudar com essa demanda.


Desde já agradeço.
andrelucio.fc@yahoo.com [shell-script]
2016-11-04 18:14:21 UTC
Permalink
Obs: O shell utilizado nesse Linux (infelizmente) é o ash.
William Alves dos Santos williamalvessantos@gmail.com [shell-script]
2016-11-04 19:32:16 UTC
Permalink
Caro Andre,

Uma vez eu precisei fazer algo semelhante, tratar um bloco de texto, eu
resolvi da seguinte forma:

Inclui um caractere no inicio e no final do bloco, se tiver o caractere
espaço troque por outro caractere, mais uma vez trocar o caractere de
quebra de linha por espaço. A partir deste momento seu bloco passa a ser
uma unica linha. Faças suas alterações e o que precisa, agora é fazer o
caminho de volta, utilizando os caracteres que escolheu para marcar as
posições e remontar o bloco.

Talvez não seja a melhor opção, a mais elegante mais foi a que funcionou
comigo.

Att

Abraços

*William Alves dos Santos*
Cel.: (11) 99616 8602 - VIVO
Cel.: (11) 96835 8172 - TIM
Post by ***@yahoo.com [shell-script]
Obs: O shell utilizado nesse Linux (infelizmente) é o ash.
itamarnet@yahoo.com.br [shell-script]
2016-11-04 22:05:40 UTC
Permalink
Andre

Espero que a dica do William seja suficiente para o que pretende, pois confesso que não entendi direito o que deseja

O exemplo que deu não ajudou muito na compreensão do processo que está fazendo, ou eu não consegui abstrair o assunto

Fiquei curioso pela solução que será apontada se alguém entender com precisão

[]'s
Itamar
William Alves dos Santos williamalvessantos@gmail.com [shell-script]
2016-11-04 22:56:21 UTC
Permalink
André,

A maneira que entendi.

Tente isso:

cat texto.txt | grep -v "#" | sed '/config/s/^/%/g;/maclist/s/$/%/g;s/$/!/'
| tr '\n' ' ' | tr '%' '\n' | sed '/radio1/s/$/!!!!!!!!!!/' | tr '!' '\n'

Abraços

*William Alves dos Santos*
Cel.: (11) 99616 8602 - VIVO
Cel.: (11) 96835 8172 - TIM
Post by ***@yahoo.com.br [shell-script]
Andre
Espero que a dica do William seja suficiente para o que pretende, pois
confesso que não entendi direito o que deseja
O exemplo que deu não ajudou muito na compreensão do processo que está
fazendo, ou eu não consegui abstrair o assunto
Fiquei curioso pela solução que será apontada se alguém entender com
precisão
[]'s
Itamar
Robson Alexandre alexandrerobson@gmail.com [shell-script]
2016-11-04 23:38:53 UTC
Permalink
André,

pelo que eu pude entender seu arquivo de blocos sempre começa o bloco com
"config wifi-iface" e temina com "list maclist 'XX:XX:XX:XX:XX:XX'" e com
uma linha em branco, correto?
Considerando isso, acredito que vc consiga fazer essa operação da seguinte
maneira.

sed '/config/{:a;/list maclist.*\n/!{N;ba;};/radio1/s/.*/&\tTEXTO A SER
INSERIDO\n\tOUTRA LINHA INSERIDA\n/;}' blocos.txt

Entenda alguns parâmetros para que vc possa adequar a solução para seu
problema

sed '/INICIO DO BLOCO/{:a;/FINAL DO BLOCO/!{N;ba;};/PESQUISA NO
BLOCO/s/.*/&\tTEXTO A SER INSERIDO\n\tOUTRA LINHA INSERIDA\n/;}' blocos.txt


Atenciosamente
Robson Alexandre







Em sex, 4 de nov de 2016 às 20:56, William Alves dos Santos
Post by William Alves dos Santos ***@gmail.com [shell-script]
André,
A maneira que entendi.
cat texto.txt | grep -v "#" | sed
'/config/s/^/%/g;/maclist/s/$/%/g;s/$/!/' | tr '\n' ' ' | tr '%' '\n' | sed
'/radio1/s/$/!!!!!!!!!!/' | tr '!' '\n'
Abraços
*William Alves dos Santos*
Cel.: (11) 99616 8602 <(11)%2099616-8602> - VIVO
Cel.: (11) 96835 8172 <(11)%2096835-8172> - TIM
Andre
Espero que a dica do William seja suficiente para o que pretende, pois
confesso que não entendi direito o que deseja
O exemplo que deu não ajudou muito na compreensão do processo que está
fazendo, ou eu não consegui abstrair o assunto
Fiquei curioso pela solução que será apontada se alguém entender com
precisão
[]'s
Itamar
--
Atenciosamente

Robson Alexandre
andrelucio.fc@yahoo.com [shell-script]
2016-11-06 22:55:56 UTC
Permalink
Antes de tudo agradeço a todos pelas respostas.

Bom só para esclarecer melhor a minha demanda, vou tentar explicar da forma mais simples possível.


### BLOCO DE TEXTO 1 ### <-- Essa linha não existe no arquivo original, ela server apenas para ilustra a explicação dos blocos de texto no arquivo de configuração.


config wifi-iface
option device 'radio0' <-- Parâmetro que será utilizado como referência para a linha adicionada abaixo.
option mode 'ap'
option iapp_interface 'company'
option ssid 'wifi'
option network 'wan'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:79:18:FF:88:BF'
list maclist '0B:7D:18:4F:99:7A' <-- Essa linha somente será adicionada no bloco de texto 1 seguindo de acordo com o parâmetro selecionado, que no caso do exemplo é o option device 'radio0'.




### FIM DO BLOCO DE TEXTO 1 ###



### BLOCO DE TEXTO 2 ###



config wifi-iface
option device 'radio1'
option mode 'ap'
option iapp_interface 'company2'
option ssid 'wifi2'
option network 'wan2'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:7D:18:4F:99:7F'


### FIM DO BLOCO DE TEXTO 2 ###


Ou seja, quando eu precisa adicionar a linha "list maclist 'MAC'", eu só posso inserir no bloco de texto indicado pelo parâmetro "option device 'radio0'", que no caso, será no bloco de texto 1 e não no bloco de texto 2.


Espero que tenha sido claro.
andrelucio.fc@yahoo.com [shell-script]
2016-11-06 22:57:57 UTC
Permalink
William e Robson, eu vou testar as soluções de vocês e depois dou um feedback. Obrigado.
'Ultimo de Miranda' miranda@prodemge.gov.br [shell-script]
2016-11-07 11:38:30 UTC
Permalink
[***@guitar ~]$ cat texto.txt
config wifi-iface
        option device 'radio0'
        option mode 'ap'
        option iapp_interface 'company'
        option ssid 'wifi'
        option network 'wan'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:79:18:FF:88:BF'


config wifi-iface
        option device 'radio1'
        option mode 'ap'
        option iapp_interface 'company2'
        option ssid 'wifi2'
        option network 'wan2'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:7D:18:4F:99:7F'

[***@guitar ~]$

[***@guitar ~]$ cat cmd.awk
BEGIN { radio0=0}
{
  if ( $0 ~ /option device/ ){
   if ( $3 == "'radio0'" )  {radio0=1}
   else { radio0=0 }
  }
  print;
  if ( radio0 == 1 ) {
  if ( $0 ~ /maclist/ ) { printf("%clist maclist '0B:7D:18:4F:99:7A'\n",9)  }
  }
}


[***@guitar ~]$ awk -f cmd.awk texto.txt
config wifi-iface
        option device 'radio0'
        option mode 'ap'
        option iapp_interface 'company'
        option ssid 'wifi'
        option network 'wan'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:79:18:FF:88:BF'
        list maclist '0B:7D:18:4F:99:7A'


config wifi-iface
        option device 'radio1'
        option mode 'ap'
        option iapp_interface 'company2'
        option ssid 'wifi2'
        option network 'wan2'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:7D:18:4F:99:7F'
Post by ***@yahoo.com [shell-script]
 >
Antes de tudo agradeço a todos pelas respostas.
Bom só para esclarecer melhor a minha demanda, vou tentar explicar da forma mais simples possível.
### BLOCO DE TEXTO 1 ### <-- Essa linha não existe no arquivo original, ela server apenas para ilustra a explicação dos blocos de texto no arquivo de configuração.
config wifi-iface
        option device 'radio0' <-- Parâmetro que será utilizado como referência para a linha adicionada abaixo.
        option mode 'ap'
        option iapp_interface 'company'
        option ssid 'wifi'
        option network 'wan'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:79:18:FF:88:BF'
        > list maclist '0B:7D:18:4F:99:7A' <-- Essa linha somente será adicionada no bloco de texto 1 seguindo de acordo com o parâmetro selecionado, que no caso do exemplo é o > option device 'radio0'> .
### FIM DO BLOCO DE TEXTO 1 ###
### BLOCO DE TEXTO 2 ###
config wifi-iface
        option device 'radio1'
        option mode 'ap'
        option iapp_interface 'company2'
        option ssid 'wifi2'
        option network 'wan2'
        option encryption 'psk2'
        option key '123:098'
        option macfilter 'deny'
        list maclist '0C:7D:18:4F:99:7F'
### FIM DO BLOCO DE TEXTO 2 ###
Ou seja, quando eu precisa adicionar a linha "list maclist 'MAC'", eu só posso inserir no bloco de texto indicado pelo parâmetro "> option device 'radio0'", que no caso, será no bloco de texto 1 e não no bloco de texto 2.
Espero que tenha sido claro.
 
andrelucio.fc@yahoo.com [shell-script]
2016-11-07 21:30:43 UTC
Permalink
Miranda, funcionou perfeitamente, muito obrigado. Tenho que me aprofundar nos estudos do awk.
'Ultimo de Miranda' miranda@prodemge.gov.br [shell-script]
2016-11-08 10:26:27 UTC
Permalink
Sim , vale a pena .
 >
Miranda, funcionou perfeitamente, muito obrigado. Tenho que me aprofundar nos estudos do awk.>
phfbettega@yahoo.com.br [shell-script]
2016-11-07 13:41:46 UTC
Permalink
Olá andrelucio, esse sed incluiu a linha.
sed -e "/radio0/,/list maclist/ { /list maclist/ a\ \tlist maclist '0B:7D:18:4F:99:7A'" -e '}'
Abraços Paulo
Post by ***@yahoo.com [shell-script]
Antes de tudo agradeço a todos pelas respostas.
Bom só para esclarecer melhor a minha demanda, vou tentar explicar da forma mais simples possível.
### BLOCO DE TEXTO 1 ### <-- Essa linha não existe no arquivo original, ela server apenas para ilustra a
explicação dos blocos de texto no arquivo de configuração.
config wifi-iface
option device 'radio0' <-- Parâmetro que será utilizado como referência para a linha adicionada abaixo.
option mode 'ap'
option iapp_interface 'company'
option ssid 'wifi'
option network 'wan'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:79:18:FF:88:BF'
list maclist '0B:7D:18:4F:99:7A' <-- Essa linha somente será adicionada no bloco de texto 1 seguindo
de acordo com o parâmetro selecionado, que no caso do exemplo é o option device 'radio0'.
### FIM DO BLOCO DE TEXTO 1 ###
### BLOCO DE TEXTO 2 ###
config wifi-iface
option device 'radio1'
option mode 'ap'
option iapp_interface 'company2'
option ssid 'wifi2'
option network 'wan2'
option encryption 'psk2'
option key '123:098'
option macfilter 'deny'
list maclist '0C:7D:18:4F:99:7F'
### FIM DO BLOCO DE TEXTO 2 ###
Ou seja, quando eu precisa adicionar a linha "list maclist 'MAC'", eu só posso inserir no bloco de texto
indicado pelo parâmetro "option device 'radio0'", que no caso, será no bloco de texto 1 e não no bloco de texto 2.
Espero que tenha sido claro.
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
andrelucio.fc@yahoo.com [shell-script]
2016-11-07 21:31:34 UTC
Permalink
Paulo, funcionou, muito obrigado!
Continue reading on narkive:
Loading...