Как я могу удалить все экземпляры помеченных блоков текста в файле с помощью 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
}