2014-09-24 65 views
1

我想在大文本文件中的每個第80個字符之前的最近的空白字符處插入換行符,該文本讀取爲單行文本。在每隔80個字符之前用最近的空白字符分隔換行文件char

我能想到我怎麼可能分裂文件使用類似正是分裂在每一個80字符:

sed -ri "s/.\{80\}/&\n/g" file.txt 

,然後再通,並把每一個有一個字符開始排隊與之前合併

sed -ri '/[^ ]$/N;s/^(.*) ([^ ]*)\n/\1\n\2/' file.txt 

但是這似乎有點尷尬,幾乎可以肯定不必要的,因爲我相信有可能是:如果它恰好結束在非空白字符和分裂在之前的換行字符的東西,如過去的空格字符線一個更清潔的方式來管理這樣的問在bash中。

噢,文件中有很多單個破折號連字符被空間包圍,所以我想要避免在任何緊接着或之前是單個破折號的空間上進行拆分。

+0

請更新您的問題,以提供一些類似於您的真實數據的示例數據。它允許快速測試解決方案。 – 2014-09-24 15:47:42

+0

它看起來非常類似於[如何使用unix命令將字符串拆分爲具有特定寬度的行?當輸入字符串是無限的?](http://stackoverflow.com/questions/25604673/how-can-i-split-string-to-lines-with-specific-width-using-unix-commands-when-th/25604803#25604803) - >'fold -w 80 -s file' – fedorqui 2014-09-24 15:51:12

+0

@fedorqui那只是問題的第一部分。還有第二部分是從'開始,然後通過並帶來每條線......',這是我無法清楚地遵循的。 – 2014-09-24 15:51:50

回答

4

您對連字符的要求是不完全清楚,我。通常情況下,文本流動會在連字符後打破單詞(如果文本中出現連字符),更好的文本格式系統會自動使用字典和一些內置啓發式連字符連字符。但是,標準的Unix工具沒有這些功能;他們只是將連字符視爲與其他任何字符相同。

如果您的文本中有連字符,但它們被空格包圍,那麼您(可能)想要避免連字符在連字符之前;連字符後面我不明白你爲什麼不想要它。無論哪種情況,如果您想避免換行符,您需要以某種方式預處理文本以避免該問題。一種方法是將您不希望用於換行的空格替換爲不同的字符,例如非空格(Unicode字符U+A0)。

例如,你可以使用這樣的管道,以避免連字符纔打破:

sed "s/ \+-/"$'\u00A0'"-/g" file.txt | fmt -w 80 

,或者,如果你想避免破壞之前或之後:

sed "s/ \+-/"$'\u00A0'"-/g;s/- \+/-"$'\u00A00'"/g" file.txt | fmt -w 80 

,如果之後您想擺脫非破碎空間:

sed "s/ \+-/"$'\u00A0'"-/g;s/- \+/-"$'\u00A00'"/g" file.txt | 
fmt -w 80 | 
sed $'s/\u00A0/ /g' 

在所有情況下,我建議指示使用fmt(如果有的話),它不僅可以在空間迴流和斷開線路,以儘量不超過最大線路長度;它也會試圖避免短線。請參閱聯機幫助頁man fmt中的-g選項。

如果fmt不可用,你可能想看看進入python模塊textwrap,其中有更多的選擇。

+0

替換連字符周圍的空格(我使用下劃線)並用替換字符替換連字符(我使用&符號)是非常有意義的。而且我不知道這個完美的'fmt'命令。 – nanker 2014-09-24 21:12:52

4

如果可用,我會使用fmt而不是sed來包裝您的線條。

fmt -w 80 file.txt 

(或調整線寬是必要的。)

+1

'fold'也可以,默認情況下'-w 80'。 – fedorqui 2014-09-24 15:54:38

+0

@fedorqui:'fold'只能打破;你需要'fmt'來流動。但他們都不能解決連字符的要求。 – rici 2014-09-24 16:02:03

+1

@rici'fold'具有'-s'選項 - >「-s,--spaces。break at spaces」。它應該做到。無論如何,是的,這只是問題的一半。 – fedorqui 2014-09-24 16:05:58

0
sed ':a 
s/\(.\{80\}\)\(.\)/\1³\2/ 
tb 
b 
:b 
s/\(.*\) \([^ ]*\)³/\1³\2/ 
s/³/\^J/^JP 
s/.*\n// 
ta' YourFile 

只是爲了好玩,fmt和其他是爲了。

  • 使用³爲標誌,其它字符可以(特別是具有如存在於文件)
  • 沒有新線增加上在80字符正好80字符
  • 力新線的線路上使用,如果沒有空間發現前
相關問題