Назад | Перейти на главную страницу

Как удалить помеченный блок текста в файле?

Как я могу удалить все экземпляры помеченных блоков текста в файле с помощью sed, grep или другой программы?

Если у меня есть файл, содержащий:

случайный
текст
// НАЧАТЬ ТЕКСТ
внутренний
текст
// КОНЕЦ ТЕКСТА
Больше
случайный
// НАЧАТЬ ТЕКСТ
asdf
// КОНЕЦ ТЕКСТА
текст

как я могу удалить все блоки текста в начальной / конечной строках, произвести следующее?

случайный
текст
Больше
случайный
текст

sed '\:// START TEXT:,\:// END TEXT:d' file

Правильный способ сделать это в Perl - использовать оператор триггера Perl

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

x..y в Perl принимает значение true, начиная с x is true и заканчивая y true. M {} - это еще один способ записать соответствие регулярному выражению, чтобы нам не приходилось сходить с ума по обратному слешу.

Простой конечный автомат:

#!/usr/bin/perl

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

Пример использования:

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

Хотя логика Флориана верна, я считаю, что на вашем примере она напечатает //END TEXT со следующим (искаженным) вводом:

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

Perl:

perl -ne '$t=1 if /^\/\/ START TEXT/; print if !$t; $t=0 if /^\/\/ END TEXT/' < sometextfile >anothertextfile
#!/usr/bin/nawk -f
BEGIN {
startblock="^/\/\ START TEXT"
endblock="^/\/\ END TEXT"
}
{
        if(! match($0,startblock)) {
                { print }
        }
        else    {
                while ( !match($0,endblock )) {
                        getline;
                }
        }

}

./removeblocks <sometextfile> другой текстовый файл

таращиться:

BEGIN {
  s = 0
}

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

s == 1 {
  next
}

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

{
  print
}