Como posso remover linhas sob um subtítulo em um arquivo usando comandos linux

3

Eu tenho um arquivo como abaixo. Em que eu quero remover as linhas sob um subtítulo particular sozinho. Eu tentei usar alguns comandos sed e awk, mas não consegui. Qualquer um pode ajudar a quebrar isso com alguns comandos do linux.

[first attempt]
a=10
b=20

[second attempt]
a=20
b=20

[third attempt ] 
a=30
b=50

Desejo remover as linhas sob subtítulo "[segunda tentativa]" sozinho. A saída deve ser como abaixo. Eu só quero remover o conteúdo sob o subtítulo e, opcionalmente, as linhas removidas podem ser substituídas por uma linha em branco

[first attempt]
a=10
b=20

[second attempt]

[third attempt ] 
a=30
b=50
    
por Viju M 22.10.2015 / 07:33

3 respostas

1

awk -v blkid=0 -v rmblk=2 '{
      if ( $1 ~ /^\[/) {
            blkid+=1;blkn=NR;print };
      if ( blkid !=rmblk && NR!=blkn )
            print ;
      else if(blkid ==rmblk && NF == 0)
                  print ""}' file.txt

Cada bloco terá o ID começando de 1 incremento por um para cada bloco: blkid .

O código de bloco do bloco que você deseja remover: rmblk

Cada bloco será iniciado quando o primeiro campo começar com [ .

A variável blkn armazena o valor NR de [first attempt] [second attempt] etc.

    
por 22.10.2015 / 11:07
1
sed '$!N;/^\[second/,/^\n\[/P;D' <infile >outfile

Isso provavelmente deve ser feito, embora eu não esteja muito claro sobre o que você quer fazer com a linha em branco à direita que precede imediatamente a próxima seção. Essa saída inclui, porque parece a coisa certa a se fazer, mas se você quiser soltar apenas aquela última linha em branco de qualquer seção que possa ser feita com relativa facilidade - então apenas pergunte.

Basicamente, para cada linha de entrada que é ! não a $ last, sed também extrai a linha N ext e a anexa ao espaço de padrão após um delimitador de caractere \n ewline inserido. Cada vez que isso acontece, o espaço padrão muda:

 ^Line1\nLine2$
 ^Line2\nLine3$
 ^Line3\nLine4$

Se o espaço de padrão atual corresponder aos padrões ^\[second ou ^\n\[ ou qualquer linha que ocorra entre esses dois, sed irá P rint up para o primeiro \n ewline ocorrendo no espaço padrão - e, portanto, ele imprime apenas metade de seu buffer para cada iteração.

Por último, sed D elimina o primeiro \n ewline no espaço padrão e inicia o script novamente a partir do topo - que é como obtemos o efeito de deslocamento. Isso é conhecido como janela deslizante . Funciona muito bem e é bastante rápido.

Eu acho que existem várias versões desta pergunta ou algo assim? Seja qual for o caso, indo pelo caminho oposto não é tão difícil de fazer, realmente.

Você pode fazer como ...

sed -ne '/^\[[^s]/,/^\[s/p' <in >out

O que seria apenas imprimir qualquer conteúdo que não siga um cabeçalho começando com um caractere s e todos os cabeçalhos, independentemente. No entanto, ele não faz a pequena nova linha depois:

[first attempt]
a=10
b=20

[second attempt]
[third attempt ]
a=30
b=50

Se você quiser ficar um pouco mais explícito, pode fazer isso também:

sed '/^\[[second]/P;$!N;//,/\n$/!P;D' <in >out

... o que faz a pequena linha nova ...

[first attempt]
a=10
b=20

[second attempt]

[third attempt ]
a=30
b=50

Todos esses são sed ranges e, para cada expressão de correspondência que se parece com:

/match1/,/match2/command

... sed aplicará o command nas linhas combinadas e em todas as linhas intermediárias.

    
por 26.10.2015 / 07:04
0

Você também pode fazer isso com um pequeno script sed . Coloque o seguinte em um arquivo:

/second/ {
   n
   : del
   /./ ! b
   N
   s/.*\n//
   b del
}

Chame script . Em seguida, use sed -f script myfile . Se você está tentando editar o arquivo, use sed -i -f script myfile , mas eu recomendo rodar o primeiro comando antes de tentar e certifique-se de que é exatamente a saída que você quer.

Explicação:

Quando a string second for encontrada, o sed verá a próxima linha. Se essa linha não estiver vazia, ela será descartada e a próxima linha do arquivo será examinada até que uma linha vazia seja encontrada. Essa linha vazia e todas as outras linhas no arquivo são impressas. (A menos que haja outra linha contendo a string second , caso em que o processo se repete.)

(Eu posso explicar mais se alguém estiver interessado.)

    
por 23.10.2015 / 16:46