$4
パラメータを取得し、パラメータごとに均等に分割し$2
(均等に分割できない場合は、最後の部分を埋めるためにスペースを追加します)、各部分を作成したランダムファイルの末尾に配置する必要があります。
dir=$3
mkdir -p -- "$dir" || exit 1
fname=$(shuf -n 1 "$1")
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 255 >"$dir/$fname"
次のようになります。
script.sh <word_src> <size_of_parts> <out_dir> <text_to_process>
。
$4
で割った部分の数によって、生成されるファイルの数が異なります$2
。デフォルトでは、<test_to_process>
に含まれるファイルを同様に隠す必要があります<out_dir>
。ファイルをアルファベット順に並べ替えるために同時に処理する方が簡単ですか<out_dir>
?
例:
script.sh <word_src> 3 <out_dir> this will be divided
「This will Divided」は、「thi」「sw」「ill」「be」「di」「vid」「ed」の3文字に均等に分割されます。この例では、末尾にスペースを追加する必要がありますed
。次に、個々の部分をランダムファイルの最後に送信します。
答え1
このルーチンは文字列分割操作を解決する必要があります。あなたのニーズに合わせて調整してください:
$ cat go.sh
#!/usr/bin/env bash
str="This will be divided"
ptr=0
interval=3
while [[ $ptr -le ${#str} ]]; do
printf "'%-3s'\n" "${str:$((ptr)):$((interval))}"
ptr=$((ptr+interval))
done
使用中:
$ ./go.sh
'Thi'
's w'
'ill'
' be'
' di'
'vid'
'ed '
これはbash
組み込みパラメータ拡張ツールを使用して部分文字列を抽出します。変数が与えられるとfoo
:
$foo
内容に置き換えfoo
${#foo}
の項目数に置き換えられますfoo
。配列の場合、これは割り当てられた値の数であり、配列でない場合は$foo
(foo=10; echo ${#foo}
yield)で2
表される文字列の長さです。${foo:4:4}
foo
5番目の文字(0は最初のインデックス)から始まり、合計4文字をcontentに置き換えます。
最後はここで重要です。文字列、これまでに印刷された文字数を示すポインター、および定義された間隔を使用します。
これをフォーマットされた文字列と組み合わせます。 %-3s
左揃えで空白が埋め込まれた文字列が出力されます。したがって、1つまたは2つの文字のみを指定すると、右側にスペースパディングが追加されます。
ファイルに書き込むには、単に変更するだけです。
printf "'%-3s'\n" "${str:$((ptr)):$((interval))}"
到着
fname="$dir/$(shuf -n 1 "$1")"
tr -dc 'A-Za-z0-9' </dev/urandom | head -c 255 > "$fname"
printf "'%-3s'\n" "${str:$((ptr)):$((interval))}" >> "$fname"