【问题标题】:Extract last digits from each word in a string with multiple words using bash使用 bash 从包含多个单词的字符串中的每个单词中提取最后一位数字
【发布时间】:2018-11-03 20:20:19
【问题描述】:

给定一个包含多个单词的字符串,如下所示,全部在一行中:

first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540

我正在尝试从字符串中获取最大数字,在这种情况下,答案应该是201805241548

我尝试过使用 awk 和 grep,但我只得到了字符串中最后一个单词的答案。

我对如何完成这项工作很感兴趣。

【问题讨论】:

  • 向我们展示这些努力。将其添加到问题中以帮助您解决此问题

标签: string bash shell substring sh


【解决方案1】:
echo 'first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540' |\
 grep -o '[0-9]\+' | sort -n | tail -1

相关部分是grep -o '[0-9]\+' | sort -n | tail -n 1

【讨论】:

    【解决方案2】:

    使用单个gnu awk 命令:

    s='first-second-third-201805241346 first-second-third-201805241348 first-second-third-201805241548 first-second-third-201705241540'
    awk -F- -v RS='[[:blank:]]+' '$NF>max{max=$NF} END{print max}' <<< "$s"
    

    201805241548
    

    或者使用grep + awk(如果gnu awk不可用):

    grep -Eo '[0-9]+' <<< "$s" | awk '$1>max{max=$1} END{print max}'
    

    【讨论】:

    • 你为什么说 gnu awk ?
    【解决方案3】:

    另一个 awk

    echo 'first-...-201705241540' | awk -v RS='[^0-9]+' '$0>max{max=$0} END{print max}'
    

    【讨论】:

      【解决方案4】:

      粗糙纯洁bash:

      n='first-second-third-201805241346 \
         first-second-third-201805241348 \
         first-second-third-201805241548 \
         first-second-third-201705241540'
      z="${n//+([a-z-])/;p=}"
      p=0 m=0 eval echo -n "${z//\;/\;m=\$((m>p?m:p))\;};m=\$((m>p?m:p))"
      echo $m
      

      输出:

      201805241548
      

      工作原理:此代码构造代码,然后运行它。

      1. z="${n//+([a-z-])/;p=}" substitutes 带有一些前置码的非数字 -- 将$p 设置为每个数字的值,(单独无用)。此时echo $z会输出:

        ;p=201805241346 \ ;p=201805241348 \ ;p=201805241548 \ ;p=201705241540
        
      2. 将添加的 ;s 替换为 more 代码,该代码将 $m 设置为 $p 的最大值,需要 eval 运行它——实际 使用eval 运行的整行代码如下所示:

        p=0 m=0
        m=$((m>p?m:p));p=201805241346
        m=$((m>p?m:p));p=201805241348
        m=$((m>p?m:p));p=201805241548
        m=$((m>p?m:p));p=201705241540
        m=$((m>p?m:p))
        
      3. 打印$m

      【讨论】:

      • 也许有非eval的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多