在bash中修改字符串

时间:2014-04-02 09:06:26

标签: bash shell terminal

我有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}

它有效,但可以缩短吗?

4 个答案:

答案 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]=2014a[2]=04a[3]=01
  • split($4,b,":")将第4个字段除以:,因此16:34提供b[1]=16b[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%%:*}"