Ao olhar para o seu script, você está descarregando e tentando editar, pesquisar e editar linhas, arquivos binários com o editor de texto vi
.
Dessa forma, você encontrará muitos caracteres de controle que subverterão a noção de linhas, o comprimento das linhas e, em algumas situações, até mesmo o fim do arquivo.
Como você está interessado apenas em texto e já está analisando o conteúdo do disco, eu adicionaria um comando strings
para descartar caracteres que não são de texto.
Para conseguir manipular sua saída no vi, você pode alterar seu script para:
sudo grep --binary-files=text --context=100 'unique string' /dev/sda1 | strings > recover_file
Eu também suspeito que será mais eficiente descartar esses caracteres de controle para começar, como em:
sudo strings /dev/sda1 | grep --context=100 'unique string' > recover_file
Embora eu não esteja inteiramente certo de que esta última instrução tenha os mesmos resultados por ser tratada como texto e não como binária.
De man strings
strings - print the strings of printable characters in files.
Description
For each file given, GNU strings prints the printable character sequences that are at least 4 characters long (or the number given with the options below) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.