Eu quero remover algumas linhas n do final de um arquivo. Isso pode ser feito usando sed?
Por exemplo, para remover linhas de 2 a 4, posso usar
$ sed '2,4d' file
Mas eu não sei os números das linhas. Eu posso excluir a última linha usando
$sed $d file
mas quero saber como remover n linhas do final. Por favor, deixe-me saber como fazer isso usando o sed ou algum outro método.
sed
?sed $d file
retorna um erro. Em vez disso, $ d deve estar entre aspas, desta forma:sed '$d' file
Respostas:
Não sei
sed
, mas isso pode ser feito comhead
:fonte
sed -e :a -e '$d;N;2,5ba' -e 'P;D' file
(,5
nas últimas 5 linhas).head
, mas não é padrão. De fato, o padrão para oshead
estados:The application shall ensure that the number option-argument is a positive decimal integer.
head: illegal line count -- -2
Se a opção codificação n for uma opção, você poderá usar chamadas seqüenciais para sed. Por exemplo, para excluir as últimas três linhas, exclua a última linha três vezes:
fonte
Dos sed one-liners :
Parece ser o que você está procurando.
fonte
10
in'$d;N;2,10ba'
Um engraçado e simples
sed
etac
solução:NOTA
"
são necessárias para o shell avaliar a$n
variável nosed
comando. Entre aspas simples, nenhuma interpolação será executada.tac
é umcat
reverso, vejaman 1 tac
{}
insed
existe para separar$n
&d
(caso contrário, o shell tenta interpolar a$nd
variável inexistente )fonte
tac
no OSXport info coreutils
||brew info coreutils
;Use
sed
, mas deixe o shell fazer as contas, com o objetivo de usar od
comando, fornecendo um intervalo (para remover as últimas 23 linhas):Para remover as últimas 3 linhas, de dentro para fora:
Dá o número de linhas do arquivo: digamos 2196
Queremos remover as últimas 23 linhas, portanto, para o lado esquerdo ou o intervalo:
Dá: 2174 Assim, a interpretação original do sed após o shell é:
Com
-i
a edição no local, o arquivo agora é 2173 linhas!Se você deseja salvá-lo em um novo arquivo, o código é:
fonte
Você poderia usar a cabeça para isso.
Usar
$ head --lines=-N file > new_file
onde N é o número de linhas que você deseja remover do arquivo.
O conteúdo do arquivo original menos as últimas N linhas agora está em new_file
fonte
Apenas para completar, gostaria de adicionar minha solução. Acabei fazendo isso com o padrão
ed
:Isso exclui as 2 últimas linhas usando a edição no local (embora não usar um arquivo temporário na
/tmp
!!)fonte
Para truncar arquivos muito grandes realmente no local, temos
truncate
comando. Ele não sabe sobre linhas, mastail
+wc
pode converter linhas em bytes:Existe uma condição óbvia de corrida se o arquivo for gravado ao mesmo tempo. Nesse caso, pode ser melhor usá
head
-lo - ele conta os bytes desde o início do arquivo (mente IO do disco), portanto, sempre truncaremos no limite da linha (possivelmente mais linhas do que o esperado se o arquivo for gravado ativamente):Handy one-liner, se você falhar, tente colocar a senha no lugar do nome de usuário:
fonte
Isso pode funcionar para você (GNU sed):
fonte
'
).d
,D
ouP
com GNU sed e não na versão posix. Parece que as linhas não são impressas após oD
e permanecem no buffer de trabalho para um novo loop sem passar para o 'final' da linha de ações.D
efeito oposto.A maioria das respostas acima parece exigir comandos / extensões do GNU:
Para uma solução um pouco mais portável:
OU
OU
Onde "10" é "n".
fonte
Com as respostas aqui, você já deve ter aprendido que o sed não é a melhor ferramenta para esta aplicação.
No entanto, acho que existe uma maneira de fazer isso usando o sed; a idéia é acrescentar N linhas para manter o espaço até que você consiga ler sem pressionar EOF. Quando o EOF for atingido, imprima o conteúdo do espaço em espera e saia.
O comando sed acima omitirá as últimas 5 linhas.
fonte
Tente o seguinte comando:
fonte
=
.tail -r
onde outros foram usadostac
para inverter a ordem das linhas e fazer com que as últimasn
sejam asn
primeiras.Isso pode ser feito em 3 etapas:
a) Conte o número de linhas no arquivo que você deseja editar:
b) Subtraia desse número o número de linhas a serem excluídas:
c) Diga ao sed para excluir desse número de linha (
$x
) até o final:fonte
sed
para excluir as linhas 7 a 10, ou seja, 4 linhas, não 3.Você pode obter a contagem total de linhas
wc -l <file>
e usarhead -n <total lines - lines to remove> <file>
fonte
Isso removerá as últimas 3 linhas de
file
:for i in $(seq 1 3); do sed -i '$d' file; done;
fonte
sed
.Eu prefiro esta solução;
onde N é o número de linhas a serem removidas.
fonte
versão posix
fonte
Para excluir as últimas 4 linhas:
fonte
tac file | sed '1,4d' | tac
porque a classificação remove o prefixo e muitos recursos.tac
comando é alguns sistemas (por exemplo FreeBSD?)Eu vim com isso, onde n é o número de linhas que você deseja excluir:
É uma pequena rotatória, mas acho fácil de seguir.
fonte
Para excluir as últimas N linhas de um arquivo, você pode usar o mesmo conceito de
Você pode usar um comando combo com tail para reverter o arquivo: se N for 5
E dessa maneira também é executado onde o
head -n -5 file
comando não é executado (como em um mac!).fonte
Isso removerá as últimas 12 linhas
fonte