Bash:在数字

时间:2017-10-27 12:41:52

标签: string bash

我有几个像这样的字符串:

var1="string one=3423423 and something which i don't care"
var2="another bigger string=413145 and something which i don't care"
var3="the longest string ever=23442 and something which i don't care"

这些字符串是python脚本的输出(我不允许触摸),我需要一种方法来提取字符串的第一部分,就在数字之后。基本上,我的输出应该是:

"string one=3423423"
"another bigger string=413145"
"the longest string ever=23442"

如您所见,我不能使用位置或类似的东西,因为数字和字符串长度并不总是相同。我假设我需要使用正则表达式或其他东西,但我真的不了解正则表达式。你能帮忙做一个命令或能做到这一点的事吗?

3 个答案:

答案 0 :(得分:1)

grep -oP '^.*?=\d+' inputfile
string one=3423423
another bigger string=413145
the longest string ever=23442

此处-o标记将grep仅打印匹配的部分,而-pperl启用grep正则表达式\d+。这里^.*?=\d+表示一个或多个数字。因此,var1="string one=3423423 and something which i don't care" name=${var1%%=*} value=${var1#*=} value=${value%%[^0-9]*} echo "$name=$value" # prints: string one=3423423 表示从行的开头打印,直到找到最后一个数字(第一个匹配)。

答案 1 :(得分:0)

您可以使用参数扩展,例如:

${var1%%=*}

%%的解释:

  • = - 删除最长的匹配后缀
  • = - 匹配*
  • ${var1#*=} - 匹配所有内容

#的解释:

  • * - 删除最短的匹配前缀
  • = - 匹配所有内容
  • = - 匹配${value%%[^0-9]*}

%%的解释:

  • [^0-9] - 删除最长的匹配后缀
  • * - 匹配任何非数字
  • extract_and_print() { local input=$1 local name=${input%%=*} local value=${input#*=} value=${value%%[^0-9]*} echo "$name=$value" } extract_and_print "$var1" extract_and_print "$var2" extract_and_print "$var3" - 匹配所有内容

要轻松地对多个值执行相同的操作, 你可以把这个逻辑包装成一个函数:

2017-01-01T12:12:41Z "GET /api/posts" HTTP/1.1 200 "-"
2017-01-01T12:12:42Z "GET /api/posts/56/comments" HTTP/1.1 200 "-"
2017-01-01T12:12:42Z "GET /api/posts" HTTP/1.1 200 "-"
2017-01-01T12:12:56Z "POST /api/posts" HTTP/1.1 202 "Safari"
2017-01-01T12:12:58Z "GET /api/posts/134/comments" HTTP/1.1 200 "-"

答案 2 :(得分:0)

$ shopt -s extglob

$ echo "${var1%%+([^0-9])}"
string one=3423423

$ echo "${var2%%+([^0-9])}"
another bigger string=413145

$ echo "${var3%%+([^0-9])}"
the longest string ever=23442

+([^0-9])是一个与一个或多个非数字匹配的扩展模式 带${var%%+([^0-9])}的{​​{1}}将从变量值的末尾删除该模式的最长匹配。

参考:patternsparameter substitution