2016-09-04 8 views
1

どのようにランダムな文字列を "爆発"させるでしょうか? 私が何をしているかは、 は、文字を爆発n個の長さランダムな文字列を爆発

characters=$(</dev/urandom tr -dc '1234567890{}[]`~\/><[email protected]#$%^&*()_+=-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' | head -c${n}) 

のランダムな文字列を取って、彼らは、k空間内に収まるようにkがある

k=27 

a r a n d 0 M B u n c H 0 f 

はlegnthを "爆発しました"。

最終的には、それぞれの文字の下にニンジン「^」をセットして、タイプされているものに沿って続けます。

あなたはスペースの数を計算するためにはbashが提供する整数演算能力がkの最大要求されたサイズの(唯一の同じ文字列を数値に展開する各文字間に収まる使用することができますhere

答えて

1

私の他の記事を見ます各チャーと空白の間のスペースは、n-1スロットの間にあります。

単純に文字列の長さを計算し、拡張したい要求されたサイズを持ちます(意図的な切り捨てを使用して)。それぞれのcharの間に置くことができるスペースの数を計算する要求されたサイズであなたは、次のようなものであることを行うことができます。

でも最大の分離は、合計で各文字の間 3-spacesある 70(コンピューティング( 17 + 48 = 65 chars

の要求されたサイズに"string to explode"をとり、展開し

#!/bin/bash 

str="string to explode" ## string 
len=${#str}    ## string length 
k=$((${1:-70}))   ## exploded size requested 

((k < len)) && { ## validate requested size > length 
    printf "error: width 'k' less than length '%d'\n" "$len" 
    exit 1 
} 

sep=$((k/len)) ## max separation between chars (integer division) 

((sep < 2)) && { ## if 1, cannot explode 
    printf "%s (no expansion)\n" "$str" 
    exit 0 
} 

sepst="" ## set separator string 
printf -v sepst "%*s" $((sep - 1)) " " 

## insert sepst betwen each char 
for ((i = 0; i < $((len - 1)); i++)); do 
    printf "%s%s" ${str:$((i)):1} "$sepst" ## str intentionally unquoted 
done          ## (quote for preserve space) 

## print final char 
printf "%s\n" "${str: -1}" 

をいずれかの側のセパレータと各spaceを印刷するには使用例

$ explodestr.sh 
s t r i n g  t o  e x p l o d e 

、引用"${str:$((i)):1}"は、それぞれspaceを(省略する代わりに)保存します。 (あなたのピックアップを取る - それだけでスペースをより顕著にする)

+0

うわー。ありがとうございました! – archae0pteryx

関連する問題