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
-n
informaperl
para executar o código em cada linha do arquivo de entrada - A sequência
-l000
informaperl
para definir o separador de registro de saída (o caractere impresso após cada string) para o byte NUL (000
). - A opção
-e
informaperl
que a sequência que segue é um código a ser executado. - A função
split
divide 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
foreach
imprime 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.