br padrão e substituição de múltiplas linhas

3

Eu preciso analisar um arquivo de texto e substituir uma certa parte dele. Eu acredito que sed é a maneira de fazer isso, mas não tenho certeza de como lidar com várias linhas com ele

O padrão que estou procurando é

set cells { \  
cell1 \  
cell2 \  
cell3 \  
}

e eu quero substituí-lo com o conteúdo de uma variável.

Algo como o seguinte deve fazer o truque, mas não funciona em várias linhas. Alguma idéia?

sed "s/set cells {.*}/set cells {$cell_variable}/" file

    
por redhavoc 22.03.2016 / 13:12

2 respostas

3

Se deve ser sed :

sed -i.bak ':a;N;$!ba;s/set cells {.*}/set cells{\n'$cell_variable'\n}/g' file
  • -i.bak cria um backup do arquivo original antes de editar em linha.
  • :a crie o rótulo a para voltar atrás.
  • N acrescenta a próxima linha de entrada no espaço padrão.
  • $! se não for a última linha ...
    • ba pula de volta para o marcador a
  • s///g procura e substitui os padrões

Uma solução mais simples com perl :

perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
  • -0777 faz o perl sugar todos os arquivos.
  • -i.bak cria um backup do arquivo original antes de editar em linha.
por 22.03.2016 / 13:34
3

Eu queria evitar o perl como uma ferramenta extra para usar. Eu não poderia fazer a solução do caos funcionar por algum motivo, mas lendo um pouco sobre sed eu encontrei uma alternativa que está aqui

sed "/set cells/!b; :Loop; N; /}/!b Loop; s/.*/set cells {$cell_def}/" -i file
  • /set cells/!b : Procure por conjunto de células, se não for encontrado, vá para a próxima linha
  • :Loop : rótulo usado para mesclar várias linhas
  • N : acrescente a próxima linha
  • /}/!b Loop : procure por}, se não for encontrado, volte ao rótulo Loop. Na prática, o loop lê uma nova linha até que o} seja encontrado
  • s/.*/set cells {$cell_def}/ : substitua tudo pelo meu comando set cells. Neste ponto, toda a declaração incluindo o {. *} Deve ser lida.

Obrigado pela ajuda a todos

    
por 22.03.2016 / 18:07