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

シェルに付属の文字列操作機能を使用します。パラメータ拡張。これらの機能は、ダッシュ、bash、kshを含むすべての非アンティークBourneスタイルのシェルに存在します。

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

答え2

IDが常に同じ長さで、文字a〜fと数字のみで構成され、出力に同様の文字列がない場合は、次のことができます。

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

0〜9の数字またはafの文字である32文字の文字列を検索します。

文字列の長さを変更するには、次のように使用します。

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

関連情報