私は驚いたことに、誰も明白なbash
ソリューションは、while
とread
しか利用していないことに言及しました。
while read -n1 character; do
echo "$character"
done < <(echo -n "$words")
は終わりに余分な改行を避けるためにecho -n
の使用に注意してください。 printf
は別の良い選択肢であり、あなたの特定のニーズに適しています。空白を無視する場合は、"$words"
を"${words// /}"
に置き換えてください。
もう1つのオプションはfold
です。しかし、それは決してforループに送られるべきではないことに注意してください。次のようにむしろ、whileループを使用する:
while read char; do
echo "$char"
done < <(fold -w1 <<<"$words")
(coreutilsのパッケージの)外部fold
コマンドを使用する主な利点は、簡潔であろう。
fold -w1 <<<"$words" | xargs -I% -- echo %
をあなたがしたいコマンドを使用して、上記の例で使用echo
コマンドを交換したいと思う:あなたは、それは次のようなxargs
などの別のコマンド(のfindutilsパッケージの一部)への出力のフィードすることができますそれぞれのキャラクターに対して走るのが好きです。 xargs
はデフォルトで空白を破棄します。 -d '\n'
を使用して、その動作を無効にすることができます。
国際
私はアジアの一部の文字でfold
をテストし、それは、Unicodeをサポートしていません実現。だから、それはASCIIのニーズには問題ありませんが、それは誰にとってもうまくいかないでしょう。その場合、いくつかの選択肢があります。
awk 'BEGIN{FS=""} {for (i=1;i<=NF;i++) print $i}'
それとも別の答えで述べたgrep
コマンド::私はおそらくawkの配列でfold -w1
を交換したい
FYI
grep -o .
パフォーマンス、私は前述の3つのオプションをベンチマークしました。最初の2つは速く、ほぼ結びついていて、折り返しループは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
出典
2015-04-27 21:22:07
Six
我々はOP *は*これは、彼らが何をしたいと考えている初心者の質問の多くを見ることを言及する価値があるかもしれませんする。非常に多くの場合、個々の文字を個別に処理する必要のない優れたソリューションが可能です。これは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)として知られています。適切な解決策は、実際にあなたが達成したいことを説明することです*あなたがそこに着くのを助けると思うステップを実行するだけではなく、あなたの質問。 – tripleee