2010-05-07 60 views
0

我有文本如bash的拆分文本爲有限字符段(陣列部件)

http://pastebin.com/H8zTbG54

可以說這文本設置的由分裂規則「或」線

的端

我需要把設定線(規則)的成段(bash的陣列成員),但我必須爲每個陣列構件,其是1024

所以每個陣列成員應包含設置規則的字符限制爲每個陣列成員秒,但字符數不能超過1024個

假設規則文本等 A或B或C或d或E或F或G或H

輸出應該是 陣列構件1 = A或b

陣列構件2 = C或d或e

陣列構件3 = F或G型

陣列構件4 = H

任何人可以幫助我做到這一點的工作在Solaris 10服務器

回答

1

這並不完全是微不足道的,並且需要更多的澄清,但基本上你用OR最初將它們分割/ AND(和可能其他一些圖案,取決於您的需要),然後遞歸地再次分割那些大於1024的塊。

PS這似乎是其中一種情況,當使用完全成熟的腳本語言(如Perl,Python,PHP或任何其他語言)可以更加方便地實現結果時。

例如,在PHP(不知道是否完全正確的,已經有一段時間沒有做PHP),一個基本的事情可能是這樣的:

function splitByOr($input) 
{ 
    $tokens = explode(" OR ",$input); 
    foreach ($t in $tokens) 
    if (strlen($t) > 1024) 
     $t=splitByOr($t); 
    return $tokens; 
} 
+0

這實際上並不是我要找的:( – soField 2010-05-07 09:55:19

0

在samplerule文件中的個體,沒有規則的長度超過148個字符 - 遠少於1024個字符的限制。如果這些規則超過了這個限制,你就不會說如何處理這些規則。

這是一個非常簡單的Bash腳本,它會將您的樣本分割爲文字「\ n」並將其分配到稱爲「規則」的數組中。它會跳過超過1024個字符的線條和打印錯誤消息:

#!/bin/bash 
while read -r line 
do 
    ((count++)) 
    if ((${#line} > 1024)) 
    then 
     echo "Line length limit of 1024 characters exceeded: Length: ${#line} Line no.: $count" 
     echo "$line" 
     continue 
    fi 
    rules+=($line) 
done < <(echo -e "$(<samplerule)") 

這種變化將截斷線的長度,而不考慮後果:

#!/bin/bash 
while read -r line 
do 
    rules+=(${line:0:1024}) 
done < <(echo -e "$(<samplerule)") 

如果文字「\ n」是不實際在該文件中,你需要使用猛砸陣列,而不是完全AWK編碼本,改變任一版本高於行這樣說:

done < <(echo -e "$(<samplerule)") 

這樣說:

done < <(awk 'BEGIN {RS="OR"} {print $0,"OR"}' samplerule) 
if [[ "${rules[${#rules[@]}-1]}" == "OR" ]] 
then 
    unset "rules[${#rules[@]}-1]" 
fi 

它將分割「OR」上的行。

編輯:添加了一條命令,在最後刪除一個額外的「OR」。