Извлечь часть строки в сценарии 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= .

Используйте функции манипуляции с оболочкой, которые поставляются с расширением параметра . Эти функции присутствуют во всех антикварных оболочках в стиле Бурна, включая тире, bash и ksh.

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

Если идентификатор всегда имеет одинаковую длину и состоит только из букв от 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,}')" 

Используя grep с помощью PCRE, вы можете использовать регулярное выражение:

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

Контрольная работа:

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

Это будет работа во всех случаях, если у вас есть SauceOnDemandSessionID= до и job-name после шаблона.