Eu uso sed
para excluir rapidamente linhas com posição específica como
sed '1d'
sed '5d'
Mas, e se eu quiser excluir a última linha do arquivo e não souber a contagem de linhas (eu sei que posso usar isso wc
e vários outros truques).
Atualmente, usando uma solução alternativa com head
e tail
combinada com wc
para fazer isso. Alguma reviravolta rápida aqui?
text-processing
sed
mtk
fonte
fonte
head
etail
...head
etail
conhecer diferentes sabores?Respostas:
in sed
$
é a última linha, portanto, para excluir a última linha:fonte
sed -i '$d' <file>
para editar o arquivo no local.$ para a última linha:
fonte
sed '$d' file; sed '$d' file
sed '$d' file
na verdade, não modifica o arquivo; apenas imprime o conteúdo do arquivo, menos a última linha. Portantosed '$d' file; sed '$d' file
, imprimirá o conteúdo do arquivo duas vezes , menos a última linha de cada vez. O equivalente de excluir as duas últimas linhas desed '$d' file
ésed '$d' file | sed '$d'
.sed -n '1{h;n;}; $q; x; p;'
. Eu estava fazendo beicinho que não podemos simplesmente fazersed '$-1,$d'
.cat file.txt | head -n -1 > new_file.txt
Cuidado, ao que parece, dependendo da última linha de
file.txt
(se terminar comEOF
, ou\n
e entãoEOF
), o número de linhas emnew_file.txt
pode ser o mesmo (comofile.txt
) após este comando (isso acontece quando não há\n
) - em qualquer caso, o conteúdo da última linha é excluído.Além disso, observe que você deve usar um segundo arquivo (intermediário). Se você catar e redirecionar para o mesmo arquivo, você o apagará.
fonte
head -n -1 file.txt > new_file.txt
. Observe que as contagens negativashead -n
estão disponíveis apenas para algumas implementações dehead
. Por exemplo, ele não funciona no FreeBSD ou na versão BusyBox dohead
.head -n -1 file.txt > new_file.txt
é melhor. Funciona da mesma maneira com relação aos meus dois comentários (mesmo número de linhas e apagar no mesmo arquivo). Quanto ao argumento negativo, essas diferenças ocorrem de tempos em tempos entre os Unixes, e geralmente são frustrantes porque você espera que seja o mesmo comando inteiramente (e por que você não faria - mesmo nome e objetivo!) - de qualquer maneira, bom ponto. (Eu uso Debian.)head --lines=-1
. Eu me deparei com essa possibilidade na página de manual de um sistema SLES11SP2 (coreutils-8.12-6.23.1)tail
ehead
fazem parte docoreutils
-rpm (pelo menos para sistemas baseados em rpm).De acordo com o changelog do coreutils, esta sintaxe é suportada desde o coreutils-versão 5.0.1
Más notícias: De acordo com a RH5-man-page, esta opção não está descrita
Boas notícias: Funciona com o RH5 (portanto, no seu caso: funciona - pelo menos com uma versão atual do RH5).
rpm -q coreutils
me mostra (no CentOS 5.8): coreutils-5.97-34.el5_8.1Não tenho certeza se RH5.5. já possui a versão coreutils que a suporta. Mas 5.5 tem EoLed de qualquer maneira.
fonte
Linux
$ é a última linha, d para exclusão:
Mac OS
Equivalente ao sed -i
fonte