在bash中修改字符串
我有bashshell脚本来修改字符串 我想从字符串44[tip]3764d6b8ae82 2014-04-01 16:34+0400 igor中获取14040116 YYMMDDHH 我当前的脚本看起来像在bash中修改字符串,bash,shell,terminal,Bash,Shell,Terminal,我有bashshell脚本来修改字符串 我想从字符串44[tip]3764d6b8ae82 2014-04-01 16:34+0400 igor中获取14040116 YYMMDDHH 我当前的脚本看起来像 raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" hg_date=`echo $raw_info | cut -d' ' -f 3` hg_date=${hg_date//-/} hg_date=${hg_date:2}
raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
hg_date=`echo $raw_info | cut -d' ' -f 3`
hg_date=${hg_date//-/}
hg_date=${hg_date:2}
hg_hour=`echo $raw_info | cut -d' ' -f 4 | cut -d':' -f 1`
hg_rev=${hg_date}${hg_hour}
它可以工作,但可以更短吗?您可以获取字符串中日期所在的特定部分,然后使用日期格式控件正确打印:
$ raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
$ date -d"$(cut -d' ' -f3-4 <<< "$raw_info")" "+%y%m%d%H"
14040116
按件:
$ cut -d' ' -f3-4 <<< "$raw_info" #get 3rd and 4th fields from the string
2014-04-01 16:34
$ date -d"2014-04-01 16:34" "+%y%m%d%H" #convert date into YYMMDDHH format
14040116
您可以获取字符串中日期所在的特定部分,然后使用日期格式控件将其正确打印:
$ raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
$ date -d"$(cut -d' ' -f3-4 <<< "$raw_info")" "+%y%m%d%H"
14040116
按件:
$ cut -d' ' -f3-4 <<< "$raw_info" #get 3rd and 4th fields from the string
2014-04-01 16:34
$ date -d"2014-04-01 16:34" "+%y%m%d%H" #convert date into YYMMDDHH format
14040116
这里有一个awk解决方案
echo "44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" | awk '{split($3,a,"-");split($4,b,":");print substr(a[1],3,2)a[2]a[3]b[1]}'
14040116
拆分$3,a,-将第三个字段除以-,因此2014-04-01给出了a[1]=2014,a[2]=04,a[3]=01。
拆分$4,b,:将第四个字段除以:,因此16:34得到b[1]=16,b[2]=34。
然后打印:
substra[1],3,2给出了2014年的最后两位数字,即14。
a[2]a[3]b[1]给出14040116。
这里有一个awk解决方案
echo "44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor" | awk '{split($3,a,"-");split($4,b,":");print substr(a[1],3,2)a[2]a[3]b[1]}'
14040116
拆分$3,a,-将第三个字段除以-,因此2014-04-01给出了a[1]=2014,a[2]=04,a[3]=01。
拆分$4,b,:将第四个字段除以:,因此16:34得到b[1]=16,b[2]=34。
然后打印:
substra[1],3,2给出了2014年的最后两位数字,即14。
a[2]a[3]b[1]给出14040116。
虽然IMHO@fedorqui的解决方案是最好的,但您也可以使用sed,例如
Ps:它取决于两位数格式和2xxx年虽然IMHO@fedorqui的解决方案是最好的,但您也可以使用sed,例如
Ps:它依赖于两位数格式和2xxx年到目前为止给出的每个解决方案都在调用外部命令,因此效率低下 更有效的方法是使用bash的内置字符串操作工具
raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
read -r tip_name hash ymd hour _ <<<"$raw_info"
hg_rev="${ymd:2:2}${ymd:5:2}${ymd:8:2}${hour%%:*}"
迄今为止给出的每个解决方案都在调用外部命令,因此效率低下 更有效的方法是使用bash的内置字符串操作工具
raw_info="44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor"
read -r tip_name hash ymd hour _ <<<"$raw_info"
hg_rev="${ymd:2:2}${ymd:5:2}${ymd:8:2}${hour%%:*}"
你为什么在这里使用cut而不是PE?…不管怎样,最终选择添加我自己的答案。啊,参数扩展!你为什么在这里使用cut而不是PE?…不管怎样,最终选择添加我自己的答案。啊,参数扩展!