Pergunta

Eu tenho um arquivo cujo conteúdo é assim:

control_data {
some data dadadadf 
some data fsfsfs
some more data
.
.
.
}
more data below 
{
.
.
}

Quero excluir os dados de "control_data" para o primeiro "}"

Eu tentei um comando

sed "s/control_data\([^}]*\)}//g"

mas isso só funciona se não tivermos várias linhas, por exemplo.este comando funciona quando temos dados como:

control_data {some data dadadadf some data fsfsfs some more data...}more data

Dá :

more data {....} 

Como fazer esse comando funcionar quando temos dados em várias linhas?Eu sou novo em scripts de shell, alguma explicação com resposta ajudará muito.

Desde já, obrigado.

Foi útil?

Solução

Este pode não ser o ideal, mas usou sed (seu código sed)

cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'

Lógica:Estou convertendo todas as novas linhas para:e então usando seu código sed e convertendo tudo:para as novas linhas nota:Minha suposição é:não estará presente no arquivo em nenhum lugar.

Outras dicas

Meu sed-fu é fraco, mas aqui está o que consegui fazer (usando esta resposta é um guia):

[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below 
{
.
.
}

Aqui está um detalhamento do comando

sed -n "             # "-n" = suppress automatic printing of pattern space
/^control_data {/ {  # if (line matches control data)
   :a;                 #   mark this spot with label a
   n;                  #   get next line
   /^}/!ba             #   if (doesn't start with "}") go back to label a
   n;                  #   get next line before leaving this control block
};                   # end if
p;                   # print everything else not affected by previous block
" input_file.txt

Isso pode funcionar para você:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
  • O primeiro comando remove todas as linhas únicas /^control_data {.*}$/d
  • O segundo comando remove todos os blocos /^control_data {/,/^}$/d
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top