在 bash 脚本中提取字符串的一部分

在 bash 脚本中提取字符串的一部分

我有一个变量,其中包含一些文本。我需要从中获取一些特定的信息。例如我有

export OUTPUT="Running \"protractor:admin\" (protractor) task Using ChromeDriver directly... [launcher] Running 1 instances of WebDriver Jasmine version: 1.3.1 revision 1354556913 SauceOnDemandSessionID=5c72e54365e9bb559ea389dc164ba754 job-name=Admin"

我需要5c72e54365e9bb559ea389dc164ba754一个变量SAUCE_ID。实际的 SessionID 会更改脚本的每次运行,因此我需要以某种方式将其拉出。它的前面SauceOnDemandSessionID=和后面始终是job-name=

答案1

使用 shell 附带的字符串操作功能参数扩展。这些功能存在于所有非古董 Bourne 风格的 shell 中,包括 dash、bash 和 ksh。

suffix=${OUTPUT#*SauceOnDemandSessionID=}
SAUCE_ID=${suffix%%[!0-9A-Fa-f]*}

答案2

如果 ID 的长度始终相同,并且仅由字母 a 到 f 和数字组成,并且输出中没有类似的字符串,则可以执行以下操作:

SAUCE_ID="$(echo $OUTPUT | egrep -o '[0-9a-f]{32}')"

它搜索 32 个字符的字符串,这些字符可以是 0-9 中的数字或 af 中的字母。

要允许字符串长度变化,请使用如下内容:

SAUCE_ID="$(echo $OUTPUT | egrep -o '[0-9a-f]{26,38}')"

此示例匹配任何包含 26 到 38 个字符的字符串。您还可以使用它来匹配至少 26 个字符的字符串:

SAUCE_ID="$(echo $OUTPUT | egrep -o '[0-9a-f]{26,}')"

答案3

与 PCRE 一起使用grep,您可以使用正则表达式:

SauceOnDemandSessionID=\K[^ ]*(?= job-name)

测试:

$ SAUCE_ID=$(grep -Po "SauceOnDemandSessionID=\K[^ ]*(?= job-name)" <<< "$OUTPUT")
$ echo "$SAUCE_ID"
5c72e54365e9bb559ea389dc164ba754

考虑到您在模式SauceOnDemandSessionID=之前和之后都有,它在所有情况下都适用。job-name

相关内容