sed -i 1,10d A.txt
apaga as linhas de 1 a 10 de A.txt , mas não imprime nada. cat
do arquivo depois (mesmo dentro da mesma sub-casca) imprime o modificado conteúdo do arquivo, não o original.
Eu tenho um arquivo com o nome A.txt Eu tenho que criar um arquivo B.txt tal que tenha algum texto escrito em iniciar, com um símbolo de pipeline, além disso, seguindo com o não de linhas no arquivo A (10 linhas aqui neste exemplo) e, em seguida, o conteúdo do arquivo A .
Observação: tenho que fazer isso com a maior facilidade possível em um único comando de linha.
Saída:
Some text | 10
(Contents of file A)
Eu tentei isso (sem incluir o símbolo do pipeline), mas não funcionou:
(echo 'Some Text';
sed -i 1,10d A.txt ;
wc -l A.txt ;cat A.txt)
>> B.txt
sed -i 1,10d A.txt
apaga as linhas de 1 a 10 de A.txt , mas não imprime nada. cat
do arquivo depois (mesmo dentro da mesma sub-casca) imprime o modificado conteúdo do arquivo, não o original.
Se houver apenas 10 linhas em A.txt
e você excluir essas linhas com sed
, as seguintes cat A.txt
não terão saída e wc
reportará 0 linhas.
Você provavelmente quer algo como:
(
echo "Some text | $(wc -l < A.txt)"
cat A.txt
) > B.txt
lines=$( wc -l A.txt ) ; printf "Some Text | %s\n" ${lines%% *} > B.txt ; cat A.txt >> B.txt
A saída de wc
inclui o nome do arquivo, portanto, ele precisa ser removido, o que é feito usando o recurso de remoção do sufixo nativo do shell ${var%%glob}
.
Eu tenho uma preferência pessoal para usar como padrão printf
em vez de echo
porque echo
tem casos em que se comporta mal.
Realizar o redirecionamento de saída duas vezes garante que o arquivo de saída não inclua dados de uma execução anterior do one-liner; o primeiro redirecionamento >
sobrescreve qualquer versão anterior.
Tags sed