2013-05-30 78 views
2

我需要將使用由,和/或\r\n\n組成的分隔符的ID列表轉換爲使用,|。 (主要爲:s/[,\r\n]+/,\|/g末尾沒有|使用sed或tr替換不同的分隔符

實施例的輸入數據:

123,456,789,012 

123, 
456 
789, 
012 

,我需要所產生的輸出是123,|456,|798,|012,:結束每個字段逗號,和一個分開它們的管道。

這看起來很簡單,但我很難理解如何管理它。實際上,我已經嘗試了......不少方法,但似乎沒有任何效果。以下是幾個示例:

  1. sed "s/[,\r\n]+/,\|/g" < filename與任何分隔符都不匹配。

  2. sed "s/(,|,?\r?\n?)/,\|/g"也不匹配任何東西。

  3. tr -t "(,?(\r|\n)+)" ",\|"tr -t "[,\r\n]+" ",\|"只替換,

  4. tr "(,|\r?\n)" ",\|"正常工作與,,\n,\r\n它取代多條匹配的字符。例如:123|||456|||789|||012|

  5. 越來越複雜:sed ':a;N;$!ba;s/\n/,/g"(來自here兩者)​​取代\n正確地,但不與\r\n工作。用[,\r\n]代替\n只是返回輸入。

我很難過。任何人都可以提供一些幫助或建議嗎?

+2

那麼輸出最後沒有管道?在輸出中,你有','標記每個字段的結尾,'''分隔字段對嗎? –

+0

正確!我的帖子中我會更清楚的,但是我在工作時被衝出了門。 :( –

+0

謝謝!而且是的,我一直在等待,直到今天我可以在工作中測試它 –

回答

2

從您的示例輸出中,似乎輸出在末尾沒有管道;您有,標記每個字段的結尾,並且|分隔字段對。對於說明書中,這可與trsed

$ x="123, 
> 456 
> 789, 
> 012" 
$ echo "$x" | tr -s '\r\n' ',' | sed 's/,\(.\)/,|\1/g' 
123,|456,|789,|012, 
$ 

tr命令替換逗號換行符和回車,擠壓(-s)重複。sed命令查找逗號後跟另一個字符,並將其替換爲,|

+0

這很好用!謝謝! –

0

我所做的是將\ r \ n序列標準化爲\ n以擺脫一種替代方法(並提高下一步的速度)。

perl -pi -e 'BEGIN { $/ = undef; } s/\r\n/\n/g; s/[,\n]/,|/g;' 

更新:從你的例子,它看起來像你的意思是用的,單occurence以取代沒有在它們之間的分隔符的多個實例|如果這是你想要做的,然後改變命令爲:

perl -pi -e 'BEGIN { $/ = undef; } END { print ",\n"; } s/\r\n/\n/g; s/[,\n]+/,|/g;' 

此外,你想要一個尾隨後,最後一個字段。

+0

不幸的是,目標環境無法訪問perl。 –