2

我有一个以下格式的字符串,我想将其转换为 csv 格式(注意分隔符是下划线字符“_”

Title_YYYYMMDD_emailname转换成Title,YYYYMMDD,emailname

这很简单,使用 sed ...

echo "Report_20131107_jlsmith" | sed 's/_/,/g'

输出:

Report,20131107,jlsmith

但是在尝试解析标题字段中包含下划线的字符串时会遇到一些麻烦。我想保留标题中的下划线(如果有的话),但将日期和电子邮件名称的下划线更改为逗号...

例如:

Report_Title_20131107_jlsmith convert to: Report_Title,20131107,jlsmith

还有一个相关的问题:有没有办法为整个字符串压缩多个下划线字符的重复实例?

Report_Title____20131107_jlsmith convert to: Report_Title,20131107,jlsmith
4

3 回答 3

1

最后请求优先:

echo "Report_Title____20131107_jlsmith" | awk '{gsub(/_+/,"_")}1'
Report_Title_20131107_jlsmith

第一个请求(使用gnu awk

echo "Report_Title_more_20131107_jlsmith" | awk '{print gensub(/_([0-9]+)_/,",\\1,","g")}'
Report_Title_more,20131107,jlsmith

一站式命令

echo "Report_Title___more_20131107_jlsmith" | awk '{gsub(/_+/,"_");print gensub(/_([0-9]+)_/,",\\1,","g")}'
Report_Title_more,20131107,jlsmith
于 2013-11-07T20:27:37.297 回答
0

使用您显示的格式,您可以使用____YYYYMMDD_替换如下,YYYYMMDD,

echo 'Report_Title____20131107_jlsmith' | sed 's/__*\([0-9]\{8\}\)__*/,\1,/g'
Report_Title,20131107,jlsmith
于 2013-11-07T20:31:27.240 回答
0

使用sed

sed -r -e 's/_+/_/g' -e 's/_([^_]+)_([^_]+)$/,\1,\2/'

或者使用严格的正则表达式更健壮

sed -r -e 's/_+/_/g' -e 's/^(.+)_([0-9]{8})_(\w+)$/\1,\2,\3/'
于 2013-11-07T20:27:45.853 回答