Em bash
:
#!/bin/bash
while IFS= read -r line; do
printf "$line"
done
IFS=
é necessário para impedir a ocorrência de stripping do IFS, ou seja, na maioria dos casos (onde o IFS contém whitespace, que é a norma) se você não fizer o IFS vazio, os espaços em branco serão removidos de cada lado de "${line}"
, independentemente do fato de você ter citado. A opção -r
para ler pára a interpretação do backspace.
Tenha em mente que isso também interpretará outros códigos de escape que podem estar presentes em sua fonte. Se isso lhe diz respeito, leia o arquivo caractere por caractere e só tenha printf em \ x códigos de escape.
Você deve sempre usar um arquivo temporário, então execute-o assim:
./foo < myfile > mytempfile && mv mytempfile myfile
Além disso, não use sed -i
para editar arquivos, não é portátil e até mesmo onde é a sintaxe varia entre implementações (seu código falhará no Mac OSX e na maioria dos BSDs, por exemplo). ed
é a melhor opção para editar arquivos.