2017-05-07 119 views
0

我有一個文本文件,並且我試圖在25個字符(包括空格)之後切斷文本,而不用將文字切成兩半(最大字長爲15)。我已經看到了一些基於PHP的解決方案,但是我想要一個使用(bash)常規命令的解決方案。如何剪切文字而不切斷文字?

我想我會做cut -c -25的初始剪輯,但我不知道如何防止單詞分成兩半。

-clarification-

輸入: 這句話包含54個字符,包含空格。

****擊魔***

希望的輸出1:每行

This sentence contains 59#25個字符

characters, spaces#每行18個字符(放置 「包括」 在這裏將打破每行

+3

請將示例輸入和您希望的輸出樣本輸入添加到您的問題中。 – Cyrus

+1

如果25個字符在一個單詞的中間,會發生什麼?使行少於25個字符? 「切割」是指「移除其餘部分」還是「插入換行」? (請參閱賽勒斯的評論。) –

+1

另外,超過25個字符的單詞應該發生什麼? – Siguza

回答

1

一個soluti 25限制)

included.#9個字符on將分別解析每個字符,跟蹤所檢查字符的數量以及當前字符是否爲空格。

在這個例子中,我們使用三個變量; $ 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開始,以及流程訂單如何檢查空白字符。這兩個都會導致我們有效地返回一個比預期更長的字符串,所以通過從字符串長度中減去兩個字符來抵消。

該聲明也可以合併到一行中;

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 

這不是一個優雅的解決方案,但應該完成工作。