Suponho que esta questão está relacionada com aquele , correto?
Nesse caso, não substituir o '^ @' por uma nova linha valeria mais a pena? No seguinte, eu estou supondo que você quer dizer '^ @', o byte ASCII NUL:
$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar
Então você precisa
sed 's/\o000/\n/g' abc.txt | head -n 2 > newfile.txt
Explicação
Isso substitui uma nova linha ( \n ) por cada byte NUL ( \o000 ), a parte \o significa que o que segue é um byte em notação octal. A saída é então canalizada para head -n 2 , que extrai as duas primeiras linhas; e as linhas resultantes são redirecionadas ( > ) para o arquivo newfile.txt .
Se for importante para você que os nomes dos arquivos sejam separados por '^ @', você pode usar isto:
perl -nl000 -e '
$num_lines =2 ;
push @a,(split /$ sed 's/\o000/\n/g' abc.txt | head -n 2
abc.tar
xxx.tar
0/)[0..$num_lines-1];
print $_ for @a' abc.txt > newfile.txt
Substitua o valor de $num_lines acima, conforme necessário, para obter as primeiras linhas $num_lines do arquivo.
Explicação
- A opção
-ninformaperlpara executar o código em cada linha do arquivo de entrada - A sequência
-l000informaperlpara definir o separador de registro de saída (o caractere impresso após cada string) para o byte NUL (000). - A opção
-einformaperlque a sequência que segue é um código a ser executado. - A função
splitdivide cada linha de entrada com o byte NUL como delimitador, obtém os primeiros resultados$num_lines([0..$num_lines-1]) e os coloca no array@a. Observe que a parte da "linha de entrada atual" não é especificada em nenhuma parte da chamada de função. Isso faz uso do fato de que a variável escalar padrão em Perl ($_) é o argumento padrão da funçãosplit(entre outros) quando nenhum argumento é fornecido. - O loop final
foreachimprime todos os elementos em@a(observe novamente como$_é o iterador padrão para o loopforeach). Como definimos o separador de registro de saída como octal000, obtemos os resultados separados pelo byte NUL como antes.