O problema com o seu comando sed
$ sed '/^[a-z]\+=/,+0d' testfile.txt
é que o script sed
é aplicado a todas as linhas dos dados de entrada.
O +0
(que é uma extensão do GNU) significa que seu script é equivalente a
$ sed '/^[a-z]\+=/d' testfile.txt
e a primeira e segunda linhas seriam excluídas, como você percebeu.
Por acaso, você obterá exatamente o mesmo efeito usando +1
, mas por outros motivos. O comando d
, em vez de ser aplicado à linha um e dois individualmente, seria aplicado às duas primeiras linhas devido à correspondência na primeira linha (ou seja, o intervalo do comando d
seria as linhas um e mais um +1
). Isso não exclui a linha três porque está fora do intervalo.
A solução sed
do GNU
$ sed '0,/^[a-z]\+=/{//d}' testfile.txt
que o usuário @Whitefield postou funciona e é bastante bom (embora a opção -r
seja desnecessária e o% start 0
possa ser alterado para 1
neste caso, se você quiser ser mais POSIX-ish) .
Uma variante BSD sed
da mesma abordagem seria parecida com
$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
}' testfile.txt
Escapar de +
é necessário apenas se o seu sed
implementar "expressões regulares básicas obsoletas" em vez de "expressões regulares básicas modernas". Tanto o BSD sed
quanto o GNU sed
no meu sistema (Mac OS X) parecem ser do tipo "moderno". O POSIX não tem essa distinção e ler os manuais ( re_format(7)
no BSD, que faz essa distinção) e a especificação POSIX lado a lado faz minha cabeça girar.