Regex 替换命令,除非条件
我正在进行一些数据清理,我需要运行一个bash脚本,它基本上可以:Regex 替换命令,除非条件,regex,bash,sed,Regex,Bash,Sed,我正在进行一些数据清理,我需要运行一个bash脚本,它基本上可以: 将每个:替换为:“ 我是用sed-I-e的/:/“:”/g“filename完成的 问题是,除非是时间数据,否则必须对行中的每个事件执行此操作 例如,如果我的线路是 VolumeId:vol-c29a6e96, Size:8, timestamp:Thu Jan 09 13:44:02 UTC 我希望这样 VolumeId":"vol-c29a6e96, Size":"8, timestamp":"Thu Jan 09 1
- 将每个:替换为
:“
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
因此,我不希望每次数据的格式为digit:digit时都应用sed命令
我该怎么做?(无需sed命令)
感谢您的帮助因为您对非sed选项是开放的,这里有一个使用
perl的选项(由于前瞻性支持):
s='VolumeId:vol-c29a6e96,大小:8,时间戳:Thu Jan 09 13:44:02 UTC'
perl-pe的/(?另一个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);:
将完全跳过所有时间戳字符串,并从剩余字符串中匹配:
。只需将匹配的:
替换为:“
,将为您提供所需的输出。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
'
+1对依赖perl正则表达式的实验特性有所保留
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