Chciałem wypisać ciąg wszystkich znaków ascii za pomocą następującego polecenia
for i in `seq 32 127`; do printf "%c" $i; done
Dane wyjściowe powyższego polecenia to:
33333334444444444555555555566666666667777777777..............
Jest to pierwsza (od lewej) cyfra każdego numeru.
Przeglądając tę stronę natknąłem się na odpowiedź na mój problem. Jak wydrukować wszystkie drukowalne znaki ASCII w CLI? , ale nadal nie rozumiem, dlaczego mój oryginalny fragment nie wyświetla znaków ascii zgodnie z przeznaczeniem.
bash
shell
character-encoding
ascii
Ifthikhan
źródło
źródło
comp.unix.shell
wątek, dlaczego to jest słuszne;)
Odpowiedzi:
Nie można bezpośrednio wydrukować kodów ascii, używając
printf "%c" $i
podobnego w C.Musisz najpierw przekonwertować wartość dziesiętną i na wartość ósemkową, a następnie wydrukować ją, używając
printf
i wstawiając\
odpowiednie wartości ósemkowe.Aby wydrukować
A
, musisz przekonwertować liczbę dziesiętną 65 na liczbę ósemkową, tj. 101, a następnie wydrukować tę liczbę ósemkową jako:To zostanie wydrukowane
A
.Musisz go zmodyfikować, aby:
Ale używając
awk
możesz drukować bezpośrednio jak w języku C.źródło
bash
izsh
można to zrobić bez pętli i bez zewnętrznego polecenia:printf $(printf '\%o' {32..127})
.(char)(127)
backspace ani coś takiego. Cokolwiek to jest, pojawia się jako jedno z pól hex lub jakkolwiek się je nazywa. Jeśli chcesz tylko „do wydrukowania” (tj. Do odczytu), po prostu przejdź do 126. Również miła myśl z ósemką. To sprytne; Myślałem w kategoriach szesnastkowych (jakprintf '\x%x; {32..126}
... lub 127, jak sądzę, skoro wszyscy to zrobiliście), ale to nie działa. Octal ratuje dzień! :) Wreszcie, @Iththikhan, nie jestem pewien, co masz na myśli.awk
często używa poleceń w stylu C i nigdzie indziej nie jest%c
używany. Używanie liczb ósemkowych różni się od używania znaków jednobajtowych.%c
Interpretuje powiązany argument jako char: wypisywany jest tylko pierwszy znak danego argumentuWydaje się, że masz już sposób na ich wydrukowanie, ale tutaj jest jeden wariant.
źródło
Potrzebujesz
printf
, ale tylko raz; możesz zastąpić jedno użycieprintf
prostszym i bardziej wydajnymecho
sekwencjami ucieczki Bash:Z hexagesimals:
Z ósemkami:
źródło