つsoluti現在の文字がスペースである場合にもチェックされた文字の数を追跡しながら、すべての文字を個別に解析することになります。
この例では、3つの変数を使用しています。 $ inputvarは文字列全体を保持し、変更されません。カットセクションを保持する$ resultvar。 $ iはループ内で使用されますが、上書きされます。
for ((i=0;i>-1;i++)); do #Start $i at zero, increment every loop, and don't break normally.
if [[ $i -le $((25 - 2)) ]]; then #If $i is less than or equal to 25*
resultvar="$resultvar""${inputvar:$i:1}" #Add character at position $i to $resultvar
else #If $i is greater than 25
if [[ ${inputvar:$i:1} == " " || -z ${textvar:$i:1} ]]; then #If character is a space
break #Exit loop; we're done here.
else #Otherwise
resultvar="$resultvar""${inputvar:$i:1}" #Add to $resultvar like before
fi
fi
done
*私は$((25 - 2))に対して長さのチェックをしています。これは、$ i = 0で始まるという事実と、プロセス順序が空白文字をどのようにチェックしているかが原因です。これらの両方を使うと、意図したよりも長い文字列を効果的に返すようになり、文字列の長さから2を引いて無効にします。
ステートメントは1行に収めることもできます。
for ((i=0;i>-1;i++)); do if [[ $i -le $((cutlength - 2)) ]]; then resultvar="$resultvar""${textvar:$i:1}"; else if [[ ${textvar:$i:1} == " " || -z ${textvar:$i:1} ]]; then break; else resultvar="$resultvar""${textvar:$i:1}"; fi; fi; done
どのような意味でも洗練された解決策ではありませんが、仕事を終わらせるべきです。
サンプル入力とそのサンプル入力の希望出力を質問に追加してください。 – Cyrus
25文字が単語の途中にある場合、どうなりますか?行を25文字より短くしますか?また、「切り取り」とは、「残りの行を削除する」または「行を挿入する」ことを意味しますか? (Cyrusのコメントを参照してください) –
また、25文字を超える単語はどうなりますか? – Siguza