Stack Overflowへの次の答えは
合理的なアプローチを強制するPOSIX-ly は以下のように単一文字を繰り返します。この例では、等号を100回使用します。
printf %100s | tr " " "="
私の問題は、それがどのように機能するのか理解していないということです。簡単な説明を好む。こんなコメントはつけないでくださいドキュメントを読むtr
、私が賢くなくてこんな主張をするようになりましたが、そんなprintf
主張を使ったことも見たこともなくてこんな質問をします。
答え1
つまり、printf %100s
100個の空白が印刷されてtr " " "="
等号に変換されるため、効果的に100個の等号が印刷されます。
それを破壊する:
printf
組み込みシェルです。通常、2つ以上のパラメータが使用され、最初のパラメータは「フォーマット文字列」であり、残りのパラメータはこの形式文字列のプレースホルダを埋めるために使用されます。テンプレートが完全に埋められると、結果が印刷されます。引数がさらにある場合は、再起動してより多くの引数を入力し、結果の文字列を印刷します。
で使用される書式文字列は、printf
単一文字で始まり終わる書式指定をとるため、整数(10進数、つまり「d」)を表し、浮動小数点数を表し、文字列を表します。文字以外の次の文字は型指定の修飾子であり、特に出力中に要求されるフィールドの長さを指定するために使用される数値です。したがって、文字列は少なくとも100文字の形式で指定され、スペースで埋められて左揃えされます(つまり、文字列の先頭にスペースが追加されます)。%
%d
%f
%s
%
%100s
追加の引数が渡されると、そのフィールドに使用されます%s
。たとえば、printf %100s abc
97個の空白が印刷され(3つの「abc」を考慮して合計100個の空白)、実際の文字列「abc」が表示されます。ただし、引数が指定されていない場合、型指定は空またはnull引数で埋められます(の場合は空の%s
文字列になり、その場合は0になります%d
)。したがって、これは空の引数を渡すのと同じです。文字列(たとえば、printf %100s ''
最終結果は100文字のパディングのみが印刷されます)。
したがって、すべてをまとめると、printf %100s
100個のスペースが印刷されます。
Now はtr
文字を入力から出力に変換するツールです。 2つのパラメータSET1とSET2を使用し、各パラメータは文字セットであり、SET1の最初の文字をSET2の最初の文字に変換し、SET1の2番目の文字をSET2の2番目の文字に変換する方法です。 。 。tr
stdinから入力を読み込み、stdoutに書き換えると(したがって上記のようなパイプに役立ちます)、常に指定された文字列からtr
その文字のすべての項目を変換します。
たとえば、tr aeiou 12345
小文字のコレクションは1から5までの数字に順番に翻訳されるため、「queueing」は「q52523ng」に翻訳されます。tr a-z A-Z
小文字を対応する大文字に変換するなど、文字範囲を渡すこともできます。
したがって、tr " " "="
文字列全体のスペースを等号に変換するだけです。パラメータとして認識されるには、最初のスペースを引用符で囲む必要があります。=
実際にはそうではありません必要引用されますが、そうして悪いことはありません。tr " " =
同じ効果があるでしょう。
それらを合わせて100個のスペースを印刷し、各スペースを等号に変換します。
これが十分に詳しく説明されてほしいのですが、理解できない部分があればコメントを残していただければ修正するよう努力いたします。
答え2
このprintf
コマンドは以下を使用します。最初のパラメータ形式で後続のパラメータを印刷するために使用されます。printf %100s
空白(左)で埋められたパラメータを100文字の幅で印刷します。型の引数が指定されていないため、空の文字列を一度フォーマットし、100個の空白を出力します。あなたは見ることができます:
$ printf %100s | hexdump -C
00000000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
00000064
(20はスペースの16進表現です。*
前の行を繰り返すという意味です。)
書式文字列は、CXprintf
指定子: %
、書式設定された値に対応するオプションの幅、および使用する書式タイプを使用します。s
文字列形式で、デフォルトでは文字列の左側にスペースが埋め込まれています。複数の形式やその他のテキスト部分がある場合があります。printf "a%10sb\n" hello
印刷
a xb.
tr
標準入力で選択した文字を選択した代替文字に置き換えます。を実行し、結果を標準出力に印刷します。tr " " "="
置換する文字は1(スペース)、置換する文字は1(等号)です。したがって、入力のすべてのスペースを変換し、=
残りは変更しません。次のことを試すこともできます。
$ tr " " "="
hello world
hello=world
(私は「hello world」と入力しました)
複数の置換を実行できます。tr abc def
aをdに、bをeに、cをfに変更し、残りは変更せずに残します。ここではprintf
安価に生成できるので、1文字だけを使用してください。
パイプライン|
の理由左コマンドの出力はprintf %100s
右コマンドの入力として使用されますtr " " "="
。つまり、100個の連続した空白が与えられたら、tr
各空白をに置き換えて=
新しい文字列を印刷します。
printf %100s | tr " " "="
====================================================================================================