web-dev-qa-db-ja.com

Bashでキャラクターを繰り返すにはどうすればよいですか?

echoでこれを行うにはどうすればよいですか?

Perl -E 'say "=" x 100'
202
sid_com

次を使用できます。

printf '=%.0s' {1..100}

仕組み:

Bashは{1..100}を展開するため、コマンドは次のようになります。

printf '=%.0s' 1 2 3 4 ... 100

Printfの形式を=%.0sに設定しました。つまり、どの引数が与えられても、常に単一の=を出力します。したがって、100個の=sを出力します。

330
dogbane

簡単な方法はありません。しかし、例えば:

seq -s= 100|tr -d '[:digit:]'

または、標準に準拠した方法:

printf %100s |tr " " "="

tput repもありますが、手元にある私の端末(xtermとlinux)については、サポートしていないようです:)

79
user332325

それを行うには複数の方法があります。

ループを使用:

  • ブレース展開は整数リテラルで使用できます:

    for i in {1..100}; do echo -n =; done    
    
  • Cのようなループでは、変数を使用できます。

    start=1
    end=100
    for ((i=$start; i<=$end; i++)); do echo -n =; done
    

組み込みのprintfを使用:

printf '=%.0s' {1..100}

ここで精度を指定すると、指定した幅(0)に合うように文字列が切り捨てられます。 printfはすべての引数を使用するためにフォーマット文字列を再利用するため、これは単に"="を100回出力します。

headprintfなど)およびtr:を使用

head -c 100 < /dev/zero | tr '\0' '='
printf %100s | tr " " "="
40
Eugene Yarmash

@ gniourf_gniourf へのヒントの入力。

注:この回答はnot元の質問には回答しませんが、complements既存の有用な回答パフォーマンスの比較による回答

ソリューションは、実行速度のみの点で比較されます-メモリ要件はではなく考慮されます(それらは異なります複数のソリューションにまたがり、繰り返し回数が多い場合は問題になる可能性があります)。

要約:

  • リピートカウントがsmallの場合、たとえば100程度までであれば、それはBashのみのソリューションを使用する価値があります。外部ユーティリティ、特にPerlの起動コストが重要です。
    • 実用的には、繰り返し文字のoneインスタンスのみが必要な場合、既存のソリューションはすべて問題ありません。
  • Withlargerepeat countsuse外部ユーティリティ、はるかに高速になるため。
    • 特に、大きな文字列でのBashのグローバルな部分文字列の置換を避けます
      (例:${var// /=})、非常に遅いため。

以下はtimingsで、OSX 10.10.4とbash 3.2を実行する3.2 GHz Intel Core i5 CPUとFusion Driveを搭載した2012年後半のiMacで撮影されたものです。 .57、および1000回の実行の平均です。

エントリは次のとおりです。

  • 実行期間の昇順でリストされています(最速が最初)
  • 接頭辞:
    • M ...潜在的なmulti-文字ソリューション
    • S ... asingle-character-only solution
    • P ... POSIX準拠のソリューション
  • 解決策の簡単な説明が続きます
  • 発信元の回答の著者の名前を接尾辞として付けます

  • 小さい繰り返し回数:100
[M, P] printf %.s= [dogbane]:                           0.0002
[M   ] printf + bash global substr. replacement [Tim]:  0.0005
[M   ] echo -n - brace expansion loop [eugene y]:       0.0007
[M   ] echo -n - arithmetic loop [Eliah Kagan]:         0.0013
[M   ] seq -f [Sam Salisbury]:                          0.0016
[M   ] jot -b [Stefan Ludwig]:                          0.0016
[M   ] awk - $(count+1)="=" [Steven Penny (variant)]:   0.0019
[M, P] awk - while loop [Steven Penny]:                 0.0019
[S   ] printf + tr [user332325]:                        0.0021
[S   ] head + tr [eugene y]:                            0.0021
[S, P] dd + tr [mklement0]:                             0.0021
[M   ] printf + sed [user332325 (comment)]:             0.0021
[M   ] mawk - $(count+1)="=" [Steven Penny (variant)]:  0.0025
[M, P] mawk - while loop [Steven Penny]:                0.0026
[M   ] gawk - $(count+1)="=" [Steven Penny (variant)]:  0.0028
[M, P] gawk - while loop [Steven Penny]:                0.0028
[M   ] yes + head + tr [Digital Trauma]:                0.0029
[M   ] Perl [sid_com]:                                  0.0059
  • Bashのみのソリューションが群を抜いていますが、繰り返し回数がこれほど少ない場合のみです! (下記参照)。
  • 外部ユーティリティ、特にPerlの起動コストは重要です。ループでこれを呼び出す必要がある場合-各反復でsmall繰り返しカウントを使用して-マルチユーティリティ、awk、およびPerlソリューションを回避します。

  • 大きな繰り返し回数:1000000(100万)
[M   ] Perl [sid_com]:                                  0.0067
[M   ] mawk - $(count+1)="=" [Steven Penny (variant)]:  0.0254
[M   ] gawk - $(count+1)="=" [Steven Penny (variant)]:  0.0599
[S   ] head + tr [eugene y]:                            0.1143
[S, P] dd + tr [mklement0]:                             0.1144
[S   ] printf + tr [user332325]:                        0.1164
[M, P] mawk - while loop [Steven Penny]:                0.1434
[M   ] seq -f [Sam Salisbury]:                          0.1452
[M   ] jot -b [Stefan Ludwig]:                          0.1690
[M   ] printf + sed [user332325 (comment)]:             0.1735
[M   ] yes + head + tr [Digital Trauma]:                0.1883
[M, P] gawk - while loop [Steven Penny]:                0.2493
[M   ] awk - $(count+1)="=" [Steven Penny (variant)]:   0.2614
[M, P] awk - while loop [Steven Penny]:                 0.3211
[M, P] printf %.s= [dogbane]:                           2.4565
[M   ] echo -n - brace expansion loop [eugene y]:       7.5877
[M   ] echo -n - arithmetic loop [Eliah Kagan]:         13.5426
[M   ] printf + bash global substr. replacement [Tim]:  n/a
  • 質問からのPerlソリューションは、断然最速です。
  • Bashのグローバル文字列置換(${foo// /=})は、大きな文字列では不可解なほど遅く、実行から外されました(Bash 4.3.30では約50分(!)、Bash 3.2.57ではさらに長くなりました-待ちませんでしたそれが終了するため)。
  • Bashループは遅く、算術ループ((( i= 0; ... )))はブレース拡張されたループ({1..n})よりも遅いですが、算術ループはよりメモリ効率が高くなります。
  • awkBSDawkを指します(OSXにもあります)-gawk(GNU Awk)および特にmawkよりも明らかに遅いです。
  • 大きなカウントとマルチ文字を使用することに注意してください。文字列、メモリ消費が考慮事項になる可能性があります-その点でアプローチが異なります。

上記を生成したBashスクリプトtestrepeat)は次のとおりです。 2つの引数が必要です。

  • 文字の繰り返し回数
  • オプションで、実行するテスト実行の数、およびaverageタイミングを計算する

言い換えると、上記のタイミングはtestrepeat 100 1000およびtestrepeat 1000000 1000で取得されたものです

#!/usr/bin/env bash

title() { printf '%s:\t' "$1"; }

TIMEFORMAT=$'%6Rs'

# The number of repetitions of the input chars. to produce
COUNT_REPETITIONS=${1?Arguments: <charRepeatCount> [<testRunCount>]}

# The number of test runs to perform to derive the average timing from.
COUNT_RUNS=${2:-1}

# Discard the (stdout) output generated by default.
# If you want to check the results, replace '/dev/null' on the following
# line with a prefix path to which a running index starting with 1 will
# be appended for each test run; e.g., outFilePrefix='outfile', which
# will produce outfile1, outfile2, ...
outFilePrefix=/dev/null

{

  outFile=$outFilePrefix
  ndx=0

  title '[M, P] printf %.s= [dogbane]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  # !! In order to use brace expansion with a variable, we must use `eval`.
  eval "
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    printf '%.s=' {1..$COUNT_REPETITIONS} >"$outFile"
  done"

  title '[M   ] echo -n - arithmetic loop [Eliah Kagan]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    for ((i=0; i<COUNT_REPETITIONS; ++i)); do echo -n =; done >"$outFile"
  done


  title '[M   ] echo -n - brace expansion loop [eugene y]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  # !! In order to use brace expansion with a variable, we must use `eval`.
  eval "
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    for i in {1..$COUNT_REPETITIONS}; do echo -n =; done >"$outFile"
  done
  "

  title '[M   ] printf + sed [user332325 (comment)]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    printf "%${COUNT_REPETITIONS}s" | sed 's/ /=/g' >"$outFile"
  done


  title '[S   ] printf + tr [user332325]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    printf "%${COUNT_REPETITIONS}s" | tr ' ' '='  >"$outFile"
  done


  title '[S   ] head + tr [eugene y]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    head -c $COUNT_REPETITIONS < /dev/zero | tr '\0' '=' >"$outFile"
  done


  title '[M   ] seq -f [Sam Salisbury]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    seq -f '=' -s '' $COUNT_REPETITIONS >"$outFile"
  done


  title '[M   ] jot -b [Stefan Ludwig]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    jot -s '' -b '=' $COUNT_REPETITIONS >"$outFile"
  done


  title '[M   ] yes + head + tr [Digital Trauma]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    yes = | head -$COUNT_REPETITIONS | tr -d '\n'  >"$outFile"
  done

  title '[M   ] Perl [sid_com]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    Perl -e "print \"=\" x $COUNT_REPETITIONS" >"$outFile"
  done

  title '[S, P] dd + tr [mklement0]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  time for (( n = 0; n < COUNT_RUNS; n++ )); do 
    dd if=/dev/zero bs=$COUNT_REPETITIONS count=1 2>/dev/null | tr '\0' "=" >"$outFile"
  done

  # !! On OSX, awk is BSD awk, and mawk and gawk were installed later.
  # !! On Linux systems, awk may refer to either mawk or gawk.
  for awkBin in awk mawk gawk; do
    if [[ -x $(command -v $awkBin) ]]; then

      title "[M   ] $awkBin"' - $(count+1)="=" [Steven Penny (variant)]'
      [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
      time for (( n = 0; n < COUNT_RUNS; n++ )); do 
        $awkBin -v count=$COUNT_REPETITIONS 'BEGIN { OFS="="; $(count+1)=""; print }' >"$outFile"
      done

      title "[M, P] $awkBin"' - while loop [Steven Penny]'
      [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
      time for (( n = 0; n < COUNT_RUNS; n++ )); do 
        $awkBin -v count=$COUNT_REPETITIONS 'BEGIN { while (i++ < count) printf "=" }' >"$outFile"
      done

    fi
  done

  title '[M   ] printf + bash global substr. replacement [Tim]'
  [[ $outFile != '/dev/null' ]] && outFile="$outFilePrefix$((++ndx))"
  # !! In Bash 4.3.30 a single run with repeat count of 1 million took almost
  # !! 50 *minutes*(!) to complete; n Bash 3.2.57 it's seemingly even slower -
  # !! didn't wait for it to finish.
  # !! Thus, this test is skipped for counts that are likely to be much slower
  # !! than the other tests.
  skip=0
  [[ $BASH_VERSINFO -le 3 && COUNT_REPETITIONS -gt 1000 ]] && skip=1
  [[ $BASH_VERSINFO -eq 4 && COUNT_REPETITIONS -gt 10000 ]] && skip=1
  if (( skip )); then
    echo 'n/a' >&2
  else
    time for (( n = 0; n < COUNT_RUNS; n++ )); do 
      { printf -v t "%${COUNT_REPETITIONS}s" '='; printf %s "${t// /=}"; } >"$outFile"
    done
  fi
} 2>&1 | 
 sort -t$'\t' -k2,2n | 
   awk -F $'\t' -v count=$COUNT_RUNS '{ 
    printf "%s\t", $1; 
    if ($2 ~ "^n/a") { print $2 } else { printf "%.4f\n", $2 / count }}' |
     column -s$'\t' -t
38
mklement0

私はseqを使用してこれを行う非常に簡単な方法を見つけました:

更新:これは、OS Xに付属のBSD seqで動作します。他のバージョンのYMMV

seq  -f "#" -s '' 10

次のように「#」を10回印刷します。

##########
  • -f "#"は、数値を無視して、それぞれに#を出力するようにフォーマット文字列を設定します。
  • -s ''は、セパレーターを空の文字列に設定して、seqが各数値の間に挿入する改行を削除します
  • -fおよび-sの後のスペースは重要なようです。

編集:ここでは便利な関数です...

repeat () {
    seq  -f $1 -s '' $2; echo
}

あなたはこのように呼び出すことができます...

repeat "#" 10

注:#を繰り返す場合、引用符は重要です!

28
Sam Salisbury

以下に2つの興味深い方法を示します。

 ubuntu @ ubuntu:〜$ yes = |ヘッド-10 | paste -s -d ''-
 ========== 
 ubuntu @ ubuntu:〜$ yes = |ヘッド-10 | tr -d "\ n" 
 ========== ubuntu @ ubuntu:〜$ 

これら2つは微妙に異なることに注意してください-pasteメソッドは新しい行で終了します。 trメソッドはサポートしていません。

17
Digital Trauma

簡単な方法はありません。 printfと置換を使用したループを避けてください。

str=$(printf "%40s")
echo ${str// /rep}
# echoes "rep" 40 times.
11
Tim
#!/usr/bin/awk -f
BEGIN {
  OFS = "="
  NF = 100
  print
}

または

#!/usr/bin/awk -f
BEGIN {
  while (z++ < 100) printf "="
}

7
Steven Penny

echoprintfの異なる実装、および/またはbash以外のシェルでPOSIX準拠と一貫性が必要な場合:

seq(){ n=$1; while [ $n -le $2 ]; do echo $n; n=$((n+1)); done ;} # If you don't have it.

echo $(for each in $(seq 1 100); do printf "="; done)

...Perl -E 'say "=" x 100'とほぼ同じ出力を生成します。

6
Geoff Nixon

質問の本来の目的は、シェルの組み込みコマンドだけでこれを行うことだったと思います。したがって、forループとprintfsは合法ですが、以下のrepPerl、およびjotも合法ではありません。それでも、次のコマンド

jot -s "/" -b "\\" $((COLUMNS/2))

たとえば、ウィンドウ全体の\/\/\/\/\/\/\/\/\/\/\/\/の行を出力します

4
Stefan Ludwig

他の人が言ったように、bashでは ブレース展開パラメータ展開 の前にあるため、{m,n}の範囲にはリテラルのみを含めることができます。 seq および jot は、クリーンなソリューションを提供しますが、同じシェルを使用している場合でも、システム間で完全に移植可能ではありません。 (seqがますます利用可能になっていますが、たとえば FreeBSD 9.3以降 。) eval および他の形式のインダイレクションは常に機能しますが、やや洗練されていません。

幸いなことに、bash Cスタイルのforループをサポート (算術式のみ)。したがって、ここに簡潔な「純粋なbash」の方法があります。

repecho() { for ((i=0; i<$1; ++i)); do echo -n "$2"; done; echo; }

これは、最初の引数として繰り返しの数をとり、2番目の引数として繰り返される文字列(問題の説明のように1文字の場合もあります)を取ります。 repecho 7 bbbbbbbbを出力します(改行で終了します)。

デニスウィリアムソン 与えた 本質的に4年前の彼の優れた答えでこの解決策シェルスクリプトで繰り返し文字の文字列を作成する 。私の関数本体はそこのコードとは少し異なります:

  • ここでの焦点は単一文字の繰り返しにあり、シェルはbashであるため、echoの代わりにprintfを使用するのがおそらく安全です。そして、この質問の問題の説明を、echoで印刷する設定を表すものとして読みました。上記の関数定義は、bashおよび ksh9 で機能します。 printfの方が移植性がありますが(通常、この種のものに使用する必要があります)、echoの構文は間違いなく読みやすいです。

    一部のシェルのechoビルトインは、-を単独でオプションとして解釈します。ただし、入力にstdinを使用するという-の通常の意味は、echoには意味がありません。 zsh これを行います。 標準ではない のように、-nを認識しないechosが必ず存在します。 (多くのBourneスタイルのシェルはCスタイルのループをまったく受け入れないため、echoの動作を考慮する必要はありません。)

  • ここでのタスクは、シーケンスを印刷することです。 あり 、変数に割り当てることでした。

$nが必要な繰り返し回数であり、それを再利用する必要がなく、さらに短いものが必要な場合:

while ((n--)); do echo -n "$s"; done; echo

nは変数である必要があります。この方法は位置パラメーターでは機能しません。 $sは繰り返されるテキストです。

4
Eliah Kagan

eval、サブシェル、外部ツール、ブレース展開のない純粋なBashの方法(つまり、変数で繰り返す番号を使用できます):

(負でない)数と変数nに展開される変数patternが与えられた場合、たとえば、

$ n=5
$ pattern=hello
$ printf -v output '%*s' "$n"
$ output=${output// /$pattern}
$ echo "$output"
hellohellohellohellohello

これで関数を作成できます:

repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    # $3=output variable name
    local tmp
    printf -v tmp '%*s' "$1"
    printf -v "$3" '%s' "${tmp// /$2}"
}

このセットでは:

$ repeat 5 hello output
$ echo "$output"
hellohellohellohellohello

この小さなトリックでは、printfを非常に多く使用します。

  • -v varname:標準出力に出力する代わりに、printfはフォーマットされた文字列の内容を変数varnameに入れます。
  • '%* s':printfは引数を使用して、対応するスペース数を出力します。たとえば、printf '%*s' 42は42個のスペースを印刷します。
  • 最後に、変数に必要な数のスペースがある場合、パラメーター展開を使用してすべてのスペースをパターンで置き換えます:${var// /$pattern}varの展開に展開され、すべてのスペースは$patternの展開に置き換えられます。

間接展開を使用して、tmp関数のrepeat変数を削除することもできます。

repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    # $3=output variable name
    printf -v "$3" '%*s' "$1"
    printf -v "$3" '%s' "${!3// /$2}"
}
3
gniourf_gniourf

Bash 3.0以降

for i in {1..100};do echo -n =;done
3
adnans

問題は、echoを使用してそれを行う方法についてでした。

echo -e ''$_{1..100}'\b='

これはPerl -E 'say "=" x 100'とまったく同じですが、echoのみを使用します。

2
chevallier
repeat() {
    # $1=number of patterns to repeat
    # $2=pattern
    printf -v "TEMP" '%*s' "$1"
    echo ${TEMP// /$2}
}
2
WSimpson

Pythonはどこにでもあり、どこでも同じように動作します。

python -c "import sys; print('*' * int(sys.argv[1]))" "=" 100

文字とカウントは個別のパラメーターとして渡されます。

2
loevborg
for i in {1..100}
do
  echo -n '='
done
echo

これは、Eliah Kaganが支持していたものの長いバージョンです。

while [ $(( i-- )) -gt 0 ]; do echo -n "  "; done

もちろん、そのためにprintfを使用することもできますが、私の好みではありません。

printf "%$(( i*2 ))s"

このバージョンはDash互換です:

until [ $(( i=i-1 )) -lt 0 ]; do echo -n "  "; done

iが初期番号です。

1
Xennex81

提案されたPythonソリューションのよりエレガントな代替手段は次のとおりです。

python -c 'print "="*(1000)'
1
Anas Tiour

エコーでこれを行うにはどうすればよいですか?

echoの後にechoが続く場合は、sedを使用してこれを行うことができます。

echo | sed -r ':a s/^(.*)$/=\1/; /^={100}$/q; ba'

実際、そのechoは不要です。

1
DaBler

あなたができる文字列の長さに応じて、文字をn回、n回、VARIABLE回、繰り返したい場合:

#!/bin/bash
vari='AB'
n=$(expr 10 - length $vari)
echo 'vari equals.............................: '$vari
echo 'Up to 10 positions I must fill with.....: '$n' equal signs'
echo $vari$(Perl -E 'say "=" x '$n)

以下が表示されます。

vari equals.............................: AB  
Up to 10 positions I must fill with.....: 8 equal signs  
AB========  
1
Raul Baron

別のオプションは、GNU seqを使用して、生成されるすべての数値と改行を削除することです。

seq -f'#%.0f' 100 | tr -d '\n0123456789'

このコマンドは、#文字を100回印刷します。

0
sigalor

ほとんどの既存のソリューションはすべて、bash-およびzsh-固有の{1..10}構文サポートに依存しており、tcshまたはOpenBSDの ksh およびほとんどの非bash shでは機能しません。

以下は、OS Xおよび任意のシェルのすべての* BSDシステムで動作するはずです。実際、さまざまな種類の装飾空間のマトリックス全体を生成するために使用できます。

$ printf '=%.0s' `jot 64` | fold -16
================
================
================
================$ 

残念なことに、末尾の改行はありません。フォールドの後に追加のprintf '\n'で修正できます:

$ printf "=%.0s" `jot 64` | fold -16 ; printf "\n"
================
================
================
================
$ 

参照:

0
cnst

私の答えはもう少し複雑で、おそらく完璧ではありませんが、大きな数字を出力したい人のために、私は3秒で約1000万を行うことができました。

repeatString(){
    # argument 1: The string to print
    # argument 2: The number of times to print
    stringToPrint=$1
    length=$2

    # Find the largest integer value of x in 2^x=(number of times to repeat) using logarithms
    power=`echo "l(${length})/l(2)" | bc -l`
    power=`echo "scale=0; ${power}/1" | bc`

    # Get the difference between the length and 2^x
    diff=`echo "${length} - 2^${power}" | bc`

    # Double the string length to the power of x
    for i in `seq "${power}"`; do 
        stringToPrint="${stringToPrint}${stringToPrint}"
    done

    #Since we know that the string is now at least bigger than half the total, grab however many more we need and add it to the string.
    stringToPrint="${stringToPrint}${stringToPrint:0:${diff}}"
    echo ${stringToPrint}
}
0
Silver Ogre

最も簡単なのは、bashでこのワンライナーを使用することです。

seq 10 | xargs -n 1 | xargs -I {} echo -n  ===\>;echo

0
shahin aref
function repeatString()
{
    local -r string="${1}"
    local -r numberToRepeat="${2}"

    if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]]
    then
        local -r result="$(printf "%${numberToRepeat}s")"
        echo -e "${result// /${string}}"
    fi
}

サンプル実行

$ repeatString 'a1' 10 
a1a1a1a1a1a1a1a1a1a1

$ repeatString 'a1' 0 

$ repeatString '' 10 

参照ライブラリ: https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash

0
Nam Nguyen

最も簡単なのは、csh/tcshでこのワンライナーを使用することです。

printf "%50s\n" '' | tr '[:blank:]' '[=]'

0
Shawn Givler