我有bash shell脚本来修改字符串。
我想从字符串14040116
获取44[tip] 3764d6b8ae82 2014-04-01 16:34 +0400 igor
(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}
hg_hour=`echo $raw_info | cut -d' ' -f 4 | cut -d':' -f 1`
hg_rev=${hg_date}${hg_hour}
它有效,但可以缩短吗?
答案 0 :(得分:3)
这是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
split($3,a,"-")
将第3个字段除以-
,因此2014-04-01
提供a[1]=2014
,a[2]=04
,a[3]=01
。split($4,b,":")
将第4个字段除以:
,因此16:34
提供b[1]=16
,b[2]=34
。然后print
:
substr(a[1],3,2)
提供2014
的最后两位数字,即14
。a[2]a[3]b[1]
提供14040116
。答案 1 :(得分:2)
您可以获取日期所在字符串的特定部分,然后使用date
格式控件正确打印它:
$ 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
要将其存储到变量中,请嵌套$()
:
$ hg_rev=$(date -d"$(cut -d' ' -f3-4 <<< "$raw_info")" "+%y%m%d%H")
$ echo "$hg_rev"
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
来自man date
:
%y last two digits of year (00..99)
%m month (01..12)
%d day of month (e.g., 01)
%H hour (00..23)
答案 2 :(得分:1)
虽然(恕我直言)@ fedorqui的解决方案是最好的,但您也可以使用sed
,例如。
sed 's/.* \(2.\)\(..\)-\(..\)-\(..\) \(..\):.*/\2\3\4\5/' <<<"$raw_info"
打印什么
14040116
Ps:它取决于两位数格式和2xxx年
答案 3 :(得分:1)
到目前为止给出的每个解决方案都在调用外部命令,因此效率低下。
更有效的方法是使用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%%:*}"