String unixsbash:从字符串中提取数字

String unixsbash:从字符串中提取数字,string,bash,unix,String,Bash,Unix,对于使用UNIX的有经验的人来说,这可能是一个非常简单的问题,但是我试图从字符串中提取一个数字,并不断得到错误的结果 这是字符串: 8962 ? 00:01:09 java 这是我想要的输出 8962 但出于某种原因,我一直得到相同的字符串。这就是我尝试过的 pid=$(echo $str | sed "s/[^[0-9]{4}]//g") 如果有人能帮助我,我将不胜感激。/^[0-9]{4}/匹配字符串开头的4位数字我想这就是您想要的: pid=$(echo $str | sed 's/

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

这是字符串:

8962 ? 00:01:09 java
这是我想要的输出

8962
但出于某种原因,我一直得到相同的字符串。这就是我尝试过的

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

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

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

我想这就是您想要的:

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

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

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根据delimeter或字节范围在不同字段中剪切一行,在这些任务中通常很有用

awk是一种较旧的编程语言,尤其适用于一行一行地完成工作。

Pure Bash:

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

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

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

Shell,无需调用外部工具

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

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

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

pid=${BASH_REMATCH[1]}
string='8962 ? 00:01:09 java'
pid=${string% \?*}
或:


我选择这个答案是因为它坚持使用sed命令:p如果PID不是四位数怎么办?那么OP应该更具体一些假设“PID”意味着1-5位数(在许多系统上)是安全的。无需设置
IFS=“?”
,因为
set--$s
将在空格处中断。您忘记了
PID=${string%%*}
@Mark:True。您忘记了
pid=${string/*}
;-)