2014-09-12 38 views
1

我做一些數據的清洗和我需要運行一個bash腳本,基本上沒有:替換命令,除非條件

  • 更換每隔:與":"

我這樣做是與sed -i -e 's/:/":"/g'

問題是,除非是時間數據,否則必須對一行中的每一次出現都進行此操作。

例如,如果我行是

VolumeId:vol-c29a6e96, Size:8, timestamp:Thu Jan 09 13:44:02 UTC 

我想這是

VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 

,所以我不希望被應用於每次sed命令數據的形式位數:digit 我該怎麼做? (無需需要一個sed命令)

謝謝您的幫助

回答

1

另一個perl的命令,

$ perl -pe 's/\d{2}:\d{2}:\d{2}(*SKIP)(*F)|:/":"/g' file 
VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 

\d{2}:\d{2}:\d{2}(*SKIP)(*F)|:將完全跳過所有的時間戳字符串,並從remaini匹配: ng字符串。只需將匹配的:替換爲":"即可獲得所需的輸出。

+0

+1有保留地爲依託的實驗功能perl regexes – 2014-09-12 15:59:49

+0

選擇這個答案,因爲它解決了我的問題。 – luca 2014-09-12 16:11:56

0

既然你在這裏使用perl(由於先行的支持)一個選項是開放給非SED選項:

s='VolumeId:vol-c29a6e96, Size:8, timestamp:Thu Jan 09 13:44:02 UTC' 
perl -pe 's/(?<=\D):|:(?=\D)/":"/g' <<< "$s" 
VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 13:44:02 UTC 
0

一個sed答案:改變冒號時間戳一些其它字符全部替換冒號,然後恢復冒號時間戳

echo "VolumeId:vol-c29a6e96, Size:18, timestamp:Thu Jan 09 13:44:02 UTC" | 
sed -r ' 
    s/([[:digit:]]{2}):([[:digit:]]{2}):([[:digit:]]{2})/\1T\2T\3/g 
    s/:/":"/g 
    s/([[:digit:]]{2})T([[:digit:]]{2})T([[:digit:]]{2})/\1:\2:\3/g 
' 
VolumeId":"vol-c29a6e96, Size":"18, timestamp":"Thu Jan 09 13:44:02 UTC