2012-08-29 8 views
9

Rozważmy następujące polecenie echo:Jak zrobić „cat” w Linuksie interpretować znaki sterujące

echo -e "at\r" 

która produkuje wyjście at w linii poleceń, to znaczy \ r szczególnym charakterze zostało zinterpretowane. Chcę zrobić dokładnie to samo z jakimś tekstem w pliku. Przypuśćmy, że dokładnie taką samą sekwencję

at\r 

są zapisywane do pliku o nazwie at.txt, a następnie chcę, aby wyświetlić je na terminalu. Ale

cat at.txt 

daje wyświetlamy

at\r 

co nie jest to, co chcę. Chcę, aby sekwencja specjalna \ r była interpretowana, a nie tylko drukowana na terminalu. Ktoś ma jakiś pomysł?

Dzięki Alex

+1

Czy 'echo -e "$ (cat plik)"' praca? (Dla małych plików) – knittl

+2

Lub jeśli plik jest bardzo duży, możesz spróbować xargs: 'cat file | xargs echo -ne' –

+0

Pierwsza sugestia działa (knittl), druga sugestia (Lee) tworzy ciąg "atr". – Alex

Odpowiedz

1

Wbudowany polecenia echo interpretuje wspólna backslash ucieka. Ale w pliku musisz zinterpretować lub przekonwertować go w podobny sposób. Może to zrobić program sed.

sed -e 's/\\r/\r/' < at.txt 

Ale tu też się nauczyłem. Zewnętrzna komenda echo zachowuje się inaczej niż wewnętrzna.

/bin/echo "\r" 

ma inne wyjście niż

echo "\r" 

Ale w zasadzie trzeba filtru do konwersji litteral \r ciąg do jednego bajta 0x0D.

+0

To po prostu nie jest poprawne ... spróbuj 'echo '\ r" 'kontra' echo -e "\ r" '. Jeśli była to powłoka, oba polecenia wyprowadzałyby ten sam ciąg. – knittl

+0

Echo zewnętrzna zachowuje się inaczej. I echo sh zachowuje się inaczej niż echo basha – knittl

10

Dlaczego nie:

while read -r line; do echo -e $line; done < at.txt 
3

Można po prostu:

echo -e $(cat at.txt) 
Powiązane problemy