![在 bash 脚本中提取字符串的一部分](https://linux22.com/image/63593/%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%8F%90%E5%8F%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E4%B8%80%E9%83%A8%E5%88%86.png)
我有一个变量,其中包含一些文本。我需要从中获取一些特定的信息。例如我有
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