2008-10-05 30 views
1

我嘗試編寫用於處理由名稱 - 值對組成的文件的KSH腳本,其中每行都包含幾個名稱值對。KSH腳本:如何在數值已經跳過逗號時分割','?

格式是:

NAME1 VALUE1,NAME2 VALUE2,NAME3 VALUE3, etc 

假設我寫:

read l 
IFS="," 
set -A nvls $l 
echo "$nvls[2]" 

這會給我的第二個名稱 - 值對,好和容易。現在,假設任務被擴展,以便值可以包含逗號。他們應該被轉義,像這樣:

NAME1 VALUE1,NAME2 VALUE2_1\,VALUE2_2,NAME3 VALUE3, etc 

很顯然,我的代碼將不再有效,因爲「讀」帶陣列的所有報價和第二個元素只是「NAME2 VALUE2_1」。

我被老卡住了,沒有「讀-A數組」。我嘗試了用「讀-r」和「eval set -A ....」的各種技巧,無濟於事。我不能使用「read nvl1 nvl2 nvl3」來進行內部閱讀和分解,因爲我不知道每行中有多少個名稱 - 值對。

有沒有人對我有幫助?

PS 我知道我已經在Perl,Python甚至是awk中做了這樣的事情。但是,我必須這樣做,在KSH(...或死亡的嘗試;)

回答

0

您還可以將\,模式更改爲其他已知不出現在任何字符串中的其他字符,然後在將輸入拆分爲數組後將其更改回來。您可以使用ksh內置模式替換語法來執行此操作,您不需要使用sed或awk或任何其他語言。

read l 
l=${l//\\,/!!} 
IFS="," 
set -A nvls $l 
unset IFS 
echo ${nvls[2]/!!/,} 
1

因爲它經常發生,我問這個問題在公共論壇:(

我周圍的報價之後工作的deviced回答分鐘通過下面的sed腳本管道輸入的文件/ unquoting問題:

sed -e 's/\([^\]\),/\1\ 
/g;s/$/\ 
/

它轉換的輸入:

NAME1.1 VALUE1.1 
NAME1.2 VALUE1.2_1\,VALUE1.2_2 
NAME1.3 VALUE1.3 
<empty line> 
NAME2.1 VALUE2.1 
<second record continues> 

現在,我可以分析該輸入這樣的:

while read name value ; do 
    echo "$name => $value" 
done 

值將通過「read」使它的逗號不加引號,如果我喜歡,我可以在某個關聯數組中填充「name」和「value」。

PS 既然我無法接受我自己的答案,我應該刪除問題還是...?

+0

是否使用sed計數?你也可以使用awk或者perl或者...來完成這個工作。 sed正則表達式讓我大吃一驚。我會在方括號內使用兩個反斜槓,但我想這實際上並不必要。 – 2008-10-11 04:22:46

+0

至於刪除這個問題 - 我不知道推薦的程序是什麼,但我懷疑破壞你的智慧語言真的是他們想要的。如果最糟糕的情況發生,我可以複製你的答案給你,讓你選擇 - 但它是一個完全的騙子。 – 2008-10-11 04:24:25