2014-09-12 52 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