-i é uma opção sed não padrão. Vem de perl . GNU e FreeBSD sed adicionaram -i independentemente no final de 2001, início de 2002 para imitar o comportamento de perl , mas com interfaces diferentes. Ele entrou em mais algumas implementações, já que com mais variação (em especial, quanto dos metadados do arquivo original é preservado).
Em perl , você faria:
perl -ni.back -e 'print unless $. == 151..154' file
$. é o número da linha atual para o identificador do arquivo de entrada atual . Quando <> / -n é usado, esse é o identificador de arquivo ARGV que é aberto para cada um dos arquivos transmitidos como argumento, mas como ARGV não está fechado entre cada arquivo, $. não é redefinir entre cada arquivo. Para isso, você precisaria:
perl -ni.back -e '
print unless $. == 151..154;
close ARGV if eof' file1 file2
GNU sed , a primeira implementação (AFAIK) para adicionar uma opção -i à perl (adicionada em 2001-09-25 mas não liberada (em 3.95) até um ano depois), tinha a linha número redefinido entre cada arquivo ( -s , outra extensão do GNU implícita).
O FreeBSD fez diferente . As principais diferenças entre o GNU e a API original do FreeBSD eram que -i requer um argumento no FreeBSD, enquanto é opcional no GNU sed como em perl . E no FreeBSD, inicialmente, o número da linha não foi resetado entre cada arquivo.
Em 2007, o FreeBSD se alinhou com o GNU sed quando chegou ao segundo ponto . O número da linha foi redefinido entre cada arquivo e uma opção -I foi adicionada para obter o comportamento antigo de -i .
-i support foi adicionado muito mais tarde a algumas outras implementações de sed como o busybox, o NetBSD e o OpenBSD, mas todos eles estão alinhados com o GNU sed em ambos os pontos.
O macOS sed é baseado em uma versão antiga do FreeBSD, então provavelmente é a única implementação que se comporta da maneira antiga do FreeBSD atualmente, e provavelmente a que você está usando.
Então, aqui, você precisaria usar perl com:
find . -type f ! -name '*.back' -exec perl -ni.back -ne '
print unless $. == 151..154;
close ARGV if eof' {} +
Ou ligue para um sed por arquivo:
find . -type f ! -name '*.back' -exec sed -i.back 151,154d {} \;
Ou instale e use o GNU em sed ou o GNU awk (com -i inplace e corresponde a FNR , não NR ) ou ed /% abordagens baseadas emex .