$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
다섯 번째 문자(0은 첫 번째 인덱스)부터 시작하여 총 4개의 문자를 content 로 바꿉니다 .
마지막이 여기서 핵심입니다. 문자열, 지금까지 인쇄한 문자 수를 나타내는 포인터 및 정의된 간격을 사용합니다.
이것을 형식화된 문자열과 결합합니다. %-3s
왼쪽 정렬되고 공백이 채워진 문자열이 출력됩니다. 따라서 하나 또는 두 개의 문자만 제공하면 오른쪽에 공백 패딩이 추가됩니다.
파일에 쓰려면 간단히 변경하면 됩니다.
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"