Ascii karakterine ondalık bastırma, komutum istendiği gibi çıkmıyor


14

Aşağıdaki komutla tüm ascii karakterlerinin bir dizesini çıkarmak istedim

for i in `seq 32 127`; do printf "%c" $i; done

Yukarıdaki komutun çıktısı:

33333334444444444555555555566666666667777777777..............

Her sayının ilk (soldan) basamağıdır.

Bu siteye baktığımda sorunumun cevabına rastladım CLI'da yazdırılabilir tüm ASCII karakterleri nasıl yazdırılır? ancak orijinal snippet'imin neden ascii karakterlerini amaçlandığı gibi vermediğini hala anlamıyorum.


1
POSIX burada var, bu dikte comp.unix.shelliplik bunun doğru olduğunu neden;)
SR_

@sr_ Konuyu işaretlediğiniz için teşekkürler. Aradığım açıklama vardı.
Ifthikhan

Yanıtlar:


13

Ascii kodlarını doğrudan printf "%c" $iC'deki gibi kullanarak yazdıramazsınız .

Önce i'nin ondalık değerini sekizlik değerine dönüştürmeniz ve ardından ilgili sekizlik değerlerini kullanarak printfve \önüne koyarak yazdırmanız gerekir .

Yazdırmak Aiçin ondalık 65'i sekizliğe, yani 101'e dönüştürmeniz ve ardından sekizlik değeri şu şekilde yazdırmanız gerekir:

printf "\101\n"

Bu yazdırılacaktır A.

Bu yüzden şu şekilde değiştirmeniz gerekir:

for i in `seq 32 127`; do printf \\$(printf "%o" $i);done;

Ancak kullanarak awkC dilinde olduğu gibi doğrudan yazdırabilirsiniz

awk 'BEGIN{for(i=32;i<=127;i++)printf "%c",i}';echo

7
Gelen bashve zshbu döngü olmadan ve dış komut olmadan yapılabilir: printf $(printf '\%o' {32..127}).
manatwork

@manatwork: ya tam olarak .. işaret ettiği için çok teşekkürler ..
pradeepchhetri

1
@pradeepchhetri: Ayrıntılı yanıt için teşekkür ederim ve gerekli bilgilerin çoğunu kapsadığı görülüyordu (bu nedenle cevabınızı seçiyorum). Ancak unix.derkeiler.com/Newsgroups/comp.unix.shell/2007-07/… adresinde bulunan aşağıdaki mesajda bulabileceğiniz önemli bir bilgiyi kaçırmışım . "İlgili dönüşüm belirteci b, c veya s ise bağımsız değişken işlenenleri dize olarak ele alınacaktır ..."
Ifthikhan

Geri al (char)(127)ya da böyle bir şey değil . Her ne ise, altıgen kutulardan biri veya ne adlandırılırsa görünür. Sadece "yazdırılabilir" (yani okunabilir) istiyorsanız, sadece 126 gidin. Ayrıca, sekizli ile güzel düşünce. Zekice; Onaltılı olarak düşünüyordum ( printf '\x%x; {32..126}sanırım ... ya da 127, sanırım, hepiniz de yaptınız çünkü), ama işe yaramıyor. Sekizlik günü kurtarır! :) Sonunda, @Ifthikhan, ne demek istediğinden emin değilim. awkgenellikle C stili komutları kullanır ve başka hiçbir yerde %ckullanılmaz. Sekizli sayıları kullanmak bir baytlık karakterlerden farklıdır.
Dylan

3

%c İlişkili bağımsız değişkeni char olarak yorumlar: verilen bağımsız değişkenin yalnızca ilk karakteri yazdırılır

Bunları yazdırmanın bir yolu var gibi görünüyor, ama burada bir varyant var.

for i in `seq 32 127`; do printf "\x$(printf "%x" $i) $i"; done

0

printfSadece bir kez ihtiyacınız var ; bir kullanımı printfdaha basit ve daha verimli echoartı Bash kaçış dizileriyle değiştirebilirsiniz:

Onaltılık sayılarla:

for i in `seq 32 127`; do
  echo -ne \\x$(printf %02x $i)
done

Sekizli ile:

for i in `seq 32 127`; do
  echo -ne \\0$(printf %03o $i)
done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.