${pasteargs// /- } パラメータ拡張とはどういう意味ですか?

${pasteargs// /- } パラメータ拡張とはどういう意味ですか?

コンテキスト: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の場合'/'で始まり、一致するすべてのパターンが次に置き換えられます。 ひも。

案内を確認した後。

  1. 何をしてください${pasteargs// /- }
  2. %s私はその主張が言及されていることを知っていますprintf。しかし%*s 16、わかりません。
  3. マニュアルを引用しても、まだわかりません。paste -d\

ベストアンサー1

  1. printf %*s 16意味:16マスを印刷してください。バラよりこの回答さらなる説明のために。これで、pasteargs16個の空白値を持つ変数です。

  2. ${pasteargs// /- }意味: 置き換えるみんな (空白)が変数に発生します- 。つまり、変数の各スペースの前にハイフンを追加します。マニュアルで引用したように:

    パターンが「/」で始まる場合、そのパターンはすべて文字列に置き換えられます。

    ここでのパターンは/ 以下を意味します。みんな空間マッチング。したがって、値はpasteargsスペースで区切られた16のハイフンです。

  3. このpasteコマンドについて最初に知る必要があるのは、コマンドの後に16のストリームを表す16のハイフンが続くことです。デフォルトでは、16個の連続行を1行にマージします。既定では、これらの行をマージすると、次の区切り文字で区切られます。タブ。したがって、paste -d\ (バックスラッシュの後のスペースに注意してください)は、行が次に区切られていることを意味します。 スペース( \ ) 変えるタブ

要約すると、このコマンド(宣言されているように)は、入力内の16本の連続した行をすべてスペースで区切られた1行にマージします。

おすすめ記事