sed '\:// START TEXT:,\:// END TEXT:d' file
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
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.
#!/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
Perl:
perl -ne '$t=1 if /^\/\/ START TEXT/; print if !$t; $t=0 if /^\/\/ END TEXT/' < sometextfile >anothertextfile
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
gawk:
BEGIN {
s = 0
}
s == 1 && $0 ~ /^\/\/ END TEXT$/ {
s = 0
next
}
s == 1 {
next
}
/^\/\/ START TEXT$/ {
s = 1
next
}
{
print
}