コンテキスト:https://stackoverflow.com/a/47348104/15603477
printf -v pasteargs %*s 16
paste -d\ ${pasteargs// /- } < <(seq 1 42)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40 41 42
Paste -d, --delimiters=LIST タブの代わりに LIST の文字を再利用します。
${パラメータ/パターン/文字列}
ファイル名拡張と同様に、パターンを拡張してパターンを生成します。パラメータが拡張され、パターンとその値と最も長い間一致する項目が文字列に置き換えられます。一致は、以下の規則に従って実行されます(パターン一致を参照)。パターンbの場合'/'で始まり、一致するすべてのパターンが次に置き換えられます。 ひも。
案内を確認した後。
- 何をしてください
${pasteargs// /- }
。 %s
私はその主張が言及されていることを知っていますprintf
。しかし%*s 16
、わかりません。- マニュアルを引用しても、まだわかりません。
paste -d\
答え1
printf %*s 16
意味:16マスを印刷してください。バラよりこの回答さらなる説明のために。これで、pasteargs
16個の空白値を持つ変数です。${pasteargs// /- }
意味: 置き換えるみんな(空白)が変数に発生します
-
。つまり、変数の各スペースの前にハイフンを追加します。マニュアルで引用したように:パターンが「/」で始まる場合、そのパターンはすべて文字列に置き換えられます。
ここでのパターンは
/
以下を意味します。みんな空間マッチング。したがって、値はpasteargs
スペースで区切られた16のハイフンです。この
paste
コマンドについて最初に知る必要があるのは、コマンドの後に16のストリームを表す16のハイフンが続くことです。デフォルトでは、16個の連続行を1行にマージします。既定では、これらの行をマージすると、次の区切り文字で区切られます。タブ。したがって、paste -d\
(バックスラッシュの後のスペースに注意してください)は、行が次に区切られていることを意味します。 スペース(\
) 変えるタブ。
要約すると、このコマンド(宣言されているように)は、入力内の16本の連続した行をすべてスペースで区切られた1行にマージします。
答え2
最善の方法は、サンドボックス(テスト)環境(仮想マシン?)でテストして結果を確認することです。あなたの質問は、例に示されている順序に従いません。
man printf
:フィールド幅 ...10進文字列の代わりに... "*"を書き込むことができます...次のパラメータで指定されたフィールドの幅を指定するには、...int型でなければなりません。
したがって、printf %*s 16
印刷するパラメータが欠落している場合は、16個のスペースが印刷されます。
この「パラメータ拡張」は、以前に印刷された16個のスペースを16個のダッシュスペースに変換します。
探す
<TAB>
これはデフォルトの区切り文字の代わりにエスケープされた空白です。