2017-02-23 50 views
0

我有一個UTF-8-BOM編碼的文本文件,其中大多數行以6-10位數字(每行增加數字)開始,並在其後面有一個字符串。Bash獲取2個6位數字之間的字符串

我想要得到每個「行」(包括數字)在我的bash腳本中進一步處理。

這將是一個很容易做的只是使用for循環與sed -n '$line\p',但不幸的是我需要的一些字符串有換行符作爲他們的一部分,所以我需要一種方法來提取兩個6位數字數字(包括第一個數字)標記一個新行。

3 「線」 的一個例子:

123456\tA random string here 
123567\t another string 
this time 
it goes over 
multiple lines 
124567\t a normal string again 

我需要什麼:

123456\tA random string here 

123567\t another string 
this time 
it goes over 
multiple lines 

124567\t a normal string again 

有幾件事情:

  • 字符串不與「」不幸的是
  • 的字符串包含所有的數字都是< 6位長,這樣一> = 6位數字始終是一個新的字符串的開始包圍線
  • 數量增加,因此字符串前的數量總是比後面
  • 一個我想所有的特殊字符轉換狀突片或換行符\t\n
  • 我需要得到較低b yte長度後面的腳本,一個字符串必須保持它的長度

我還是新來的,所以如果我把它放在錯誤的地方,或者它已經回答了,告訴我!

+5

你可以複製粘貼文件的樣本與預期的輸出? – Inian

+0

作爲一個起點,你可能想看看'awk'這樣做。 –

+3

一個例子會很有用! –

回答

0

我希望「UTF-8-BOM編碼」不是陷阱。
這是我的建議,如果它不是。 (末尾以換行符)

bash-3.1$ sed -En '/^[0-9]{6,10}/!{:a;H;n;/^[0-9]{6,10}/!ba;x;s/\n/\\n/g;s/\t/\\t/g;p};/^[0-9]{6,10}/{x;s/\t/\\t/g;1!p;x;h;z;}' input.txt 

輸出爲樣本輸入:這裏

123456 \ TA隨機串
123567 \噸另一個字符串\ n該時間\尼特越過\ nmultiple線
124567 \ TA正常的字符串再次

我認爲相關的6-10位也總是在一行的開頭,
否則會變得棘手。

注:
字符串長度將由1對於每個新行\n或製表\t增加;
,因爲請求的「\ n」和「\ t」每個都是兩個字符。

相關問題