2017-05-07 8 views
0

私はテキストファイルを持っており、半分の単語をカットすることなく(最大単語長は15)、25文字(空白を含む)の後にテキストを切り捨てようとしています。私はいくつかのPHPベースのソリューションを見てきましたが、私は(bash)の通常のコマンドを使用するソリューションが欲しいです。単語をカットせずにテキストをカットするには?

私は最初のカットをcut -c -25としていますが、単語を半分に分割しないようにする方法はわかりません。

-clarification-

入力: この文は、54の文字が含まれ、スペースが含まれています。

****バッシュ魔法***

所望の出力1:行あたり

This sentence contains 59#25文字

characters, spaces(置く行あたり18文字が壊れるここに "含まれている" # 25リミット)行当たり

included.

#9文字

+3

サンプル入力とそのサンプル入力の希望出力を質問に追加してください。 – Cyrus

+1

25文字が単語の途中にある場合、どうなりますか?行を25文字より短くしますか?また、「切り取り」とは、「残りの行を削除する」または「行を挿入する」ことを意味しますか? (Cyrusのコメントを参照してください) –

+1

また、25文字を超える単語はどうなりますか? – Siguza

答えて

1

つ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 

どのような意味でも洗練された解決策ではありませんが、仕事を終わらせるべきです。

関連する問題