-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
.