나는 아무도 분명한 언급하지 않았다 놀랐어요 bash
만을 사용하는 솔루션을 while
하고 read
.
while read -n1 character; do
echo "$character"
done < <(echo -n "$words")
echo -n
마지막에 불필요한 줄 바꿈을 피하기 위해 의 사용에 유의하십시오 . printf
또 다른 좋은 옵션이며 특정 요구에 더 적합 할 수 있습니다. 당신이 공백 무시하려는 경우 교체 "$words"
와 함께 "${words// /}"
.
또 다른 옵션은 fold
. 그러나 for 루프에 입력해서는 안됩니다. 대신 다음과 같이 while 루프를 사용하십시오.
while read char; do
echo "$char"
done < <(fold -w1 <<<"$words")
fold
( coreutils 패키지의) 외부 명령 사용의 주요 이점 은 간결함입니다. 다음과 같이 xargs
( findutils 패키지의 일부) 와 같은 다른 명령에 출력을 제공 할 수 있습니다 .
fold -w1 <<<"$words" | xargs -I% -- echo %
echo
위의 예에서 사용 된 명령을 각 문자에 대해 실행 하려는 명령 으로 바꾸고 싶을 것입니다. 참고 xargs
기본적으로 공백 무시합니다. -d '\n'
해당 동작을 비활성화하는 데 사용할 수 있습니다 .
국제화
방금 fold
일부 아시아 문자로 테스트 한 결과 유니 코드가 지원되지 않는다는 것을 깨달았습니다. 따라서 ASCII 요구 사항에는 괜찮지 만 모든 사람에게 작동하지는 않습니다. 이 경우 몇 가지 대안이 있습니다.
아마도 fold -w1
awk 배열로 대체 할 것입니다 .
awk 'BEGIN{FS=""} {for (i=1;i<=NF;i++) print $i}'
또는 grep
다른 답변에 언급 된 명령 :
grep -o .
공연
참고로 앞서 언급 한 3 가지 옵션을 벤치마킹했습니다. 처음 두 개는 빠르고 거의 묶였으며 폴드 루프는 while 루프보다 약간 빠릅니다. 당연히 xargs
가장 느 렸습니다. 75 배 더 느 렸습니다.
다음은 (축약 된) 테스트 코드입니다.
words=$(python -c 'from string import ascii_letters as l; print(l * 100)')
testrunner(){
for test in test_while_loop test_fold_loop test_fold_xargs test_awk_loop test_grep_loop; do
echo "$test"
(time for (( i=1; i<$((${1:-100} + 1)); i++ )); do "$test"; done >/dev/null) 2>&1 | sed '/^$/d'
echo
done
}
testrunner 100
결과는 다음과 같습니다.
test_while_loop
real 0m5.821s
user 0m5.322s
sys 0m0.526s
test_fold_loop
real 0m6.051s
user 0m5.260s
sys 0m0.822s
test_fold_xargs
real 7m13.444s
user 0m24.531s
sys 6m44.704s
test_awk_loop
real 0m6.507s
user 0m5.858s
sys 0m0.788s
test_grep_loop
real 0m6.179s
user 0m5.409s
sys 0m0.921s