【问题标题】:Modify string in bash修改bash中的字符串
【发布时间】:2014-04-02 09:06:25
【问题描述】:

我有 bash shell 脚本来修改字符串。

我想从字符串 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}
hg_hour=`echo $raw_info | cut -d' ' -f 4 | cut -d':' -f 1`

hg_rev=${hg_date}${hg_hour}

有效,但可以更短吗?

【问题讨论】:

    标签: bash shell terminal


    【解决方案1】:

    这是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,"-") 将第三个字段除以-,因此2014-04-01 得到a[1]=2014a[2]=04a[3]=01
    • split($4,b,":")将第四个字段除以:,所以16:34 得到b[1]=16b[2]=34

    然后print:

    • substr(a[1],3,2) 给出2014 的最后两位数字,即14
    • a[2]a[3]b[1] 给了14040116

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 有什么理由在这里使用 cut 而不是 PE?
      • ...无论如何,最终选择添加我自己的答案。
      • 啊,参数扩展!
      【解决方案3】:

      虽然(恕我直言)@fedorqui 的解决方案是最好的,但您也可以使用 sed,例如。

      sed 's/.* \(2.\)\(..\)-\(..\)-\(..\) \(..\):.*/\2\3\4\5/' <<<"$raw_info"
      

      打印什么

      14040116
      

      Ps:取决于两位数格式和2xxx年

      【讨论】:

        【解决方案4】:

        迄今为止给出的每个解决方案都在调用外部命令,因此不必要地低效。

        更有效的方法是使用 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%%:*}"
        

        【讨论】:

          猜你喜欢
          • 2021-10-22
          • 2014-05-30
          • 2014-11-27
          • 1970-01-01
          • 2011-07-12
          • 2023-01-10
          • 2017-09-26
          • 2018-04-10
          • 1970-01-01
          相关资源
          最近更新 更多