Como remover um bloco marcado de texto em um arquivo?

5

Como posso remover todas as instâncias de blocos de texto marcados em um arquivo com sed, grep ou outro programa?

Se eu tiver um arquivo que contenha:

random
text
// START TEXT
internal
text
// END TEXT
more
random
// START TEXT
asdf
// END TEXT
text

Como posso remover todos os blocos de texto nas linhas de início / fim, produzir o seguinte?

random
text
more
random
text

    
por EmpireJones 02.05.2010 / 10:11

6 respostas

5
sed '\:// START TEXT:,\:// END TEXT:d' file
    
por 02.05.2010 / 12:16
2

A maneira correta de fazer isso em Perl é com o operador de flip-flop do Perl

perl -ne'print unless m{^// START TEXT}..m{^// END TEXT}'

x..y em Perl é avaliado como verdadeiro, com x sendo verdadeiro e terminando quando y é verdadeiro. O m {} é outra forma de escrever uma correspondência de expressão regular para que não tenhamos de enlouquecer todas as suas barras invertidas.

    
por 03.05.2010 / 18:46
1
#!/usr/bin/nawk -f
BEGIN {
startblock="^/\/\ START TEXT"
endblock="^/\/\ END TEXT"
}
{
        if(! match($0,startblock)) {
                { print }
        }
        else    {
                while ( !match($0,endblock )) {
                        getline;
                }
        }

}

./remoblocks < sometextfile > anothertextfile

    
por 02.05.2010 / 11:17
1

Perl:

perl -ne '$t=1 if /^\/\/ START TEXT/; print if !$t; $t=0 if /^\/\/ END TEXT/' < sometextfile >anothertextfile
    
por 02.05.2010 / 11:33
1

Simple State Machine:

#!/usr/bin/perl

my $inblock = 0;
while (<>) {
    if (/^\/\/ START TEXT/) {
        $inblock=1;
    } elsif (/^\/\/ END TEXT/) {
        $inblock=0;
    } elsif ( ! $inblock) {
        print;
    }
}

Exemplo de uso:

cat testfile | perl remove_block.pl
random
text
more
random
text

Embora a lógica de Florian seja sólida, acredito que com o seu exemplo, será impressa //END TEXT com a seguinte entrada (malformada):

random
text
// START TEXT
internal
text
// END TEXT
// END TEXT
more
random
// START TEXT
asdf
// END TEXT
text 
    
por 02.05.2010 / 20:23
0

gawk:

BEGIN {
  s = 0
}

s == 1 && $0 ~ /^\/\/ END TEXT$/ {
  s = 0
  next
}

s == 1 {
  next
}

/^\/\/ START TEXT$/ {
  s = 1
  next
}

{
  print
}
    
por 02.05.2010 / 11:10