【问题标题】:UNIX BASH: extracting number from stringUNIX BASH:从字符串中提取数字
【发布时间】:2011-04-03 22:35:53
【问题描述】:

对于有经验的 UNIX 人员来说,这可能是一个非常简单的问题,但是我试图从字符串中提取一个数字并不断得到错误的结果。

这是字符串:

8962 ? 00:01:09 java

这是我想要的输出

8962

但由于某种原因,我不断得到相同的字符串。这是我试过的

pid=$(echo $str | sed "s/[^[0-9]{4}]//g")

如果有人可以帮助我,将不胜感激。

【问题讨论】:

  • 如果 PID 不是四位数怎么办?

标签: string bash unix


【解决方案1】:

纯猛击:

string='8962 ? 00:01:09 java'
pid=${string% \?*}

或者:

string='8962 ? 00:01:09 java'
array=($string)
pid=${array[0]}

【讨论】:

  • 你忘了pid=${string%% *}
  • @Mark:是的。你忘了pid=${string/ *} ;-)
【解决方案2】:

Shell,无需调用外部工具

$ s="8962 ? 00:01:09 java"
$ IFS="?"
$ set -- $s
$ echo $1
8962

【讨论】:

  • 无需设置IFS="?",因为set -- $s 会在空格处中断。
【解决方案3】:

纯猛击:

string="8962 ? 00:01:09 java"

[[ $string =~ ^([[:digit:]]{4}) ]]

pid=${BASH_REMATCH[1]}

【讨论】:

    【解决方案4】:

    给猫剥皮的方法不止一种:

    pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | cut -d' ' -f1
    8962
    pti@pti-laptop:~$ echo 8962 ? 00:01:09 java | awk '{print $1}'
    8962
    

    cut 根据分隔符或仅字节范围在不同字段中切割一条线,通常在这些任务中很有用。

    awk 是一种较旧的编程语言,对于一次处理一行内容特别有用。

    【讨论】:

      【解决方案5】:

      我想这就是你想要的:

      pid=$(echo $str | sed 's/^\([0-9]\{4\}\).*/\1/')
      

      【讨论】:

      • 我选择这个答案是因为它坚持使用 sed 命令:p
      【解决方案6】:

      /^[0-9]{4}/ 匹配字符串开头的 4 位数字

      【讨论】:

      • 那么OP应该更具体
      • 可以安全地假设“pid”意味着 1-5 位数字(在许多系统上)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2023-03-17
      • 2012-09-24
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多