Захватить группу из регулярных выражений в bash-скрипте - PullRequest
0 голосов
/ 15 марта 2019

При сборке пакета R команда выводит шаги процесса в стандартный вывод. Из этого вывода я хотел бы получить окончательное имя пакета.

В смоделированном скрипте ниже я показываю вывод команды build. Часть, которая должна быть захвачена, является последней строкой, начинающейся с building.

Как получить регулярное выражение для сопоставления с этими кавычками, а затем записать имя пакета в переменную?

#!/usr/bin/env bash

var=$(cat <<"EOF"
Warning message:
* checking for file ‘./DESCRIPTION’ ... OK
* preparing ‘analysis’:
* checking DESCRIPTION meta-information ... OK
* cleaning src
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
Removed empty directory ‘analysis/.idea/inspectionProfiles’
Removed empty directory ‘analysis/.idea/snapshots’
* creating default NAMESPACE file
* building ‘analysis_0.1.tar.gz’
EOF
)

regex="building [\u2018](.*?)?[\u2019]"

if [[ "${var}" =~ $regex ]]; then
  pkgname="${BASH_REMATCH[1]}"
  echo "${pkgname}"
else
  echo "sad face"
fi

Это должно работать как на macOS, так и на CentOS.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Поддержка экранирования Unicode \u и \U была представлена ​​в Bash 4.2. CentOS 7 имеет Bash 4.2, поэтому он должен работать на этой платформе:

regex=$'.*building[[:space:]]+\u2018(.*)\u2019'

К сожалению, более ранние версии CentOS имели более старые версии Bash, и я считаю, что версия Bash по умолчанию для MacOS по-прежнему 3.2. Для тех, предполагая, что кавычки закодированы как UTF-8, это должно работать:

regex=$'.*building[[:space:]]+\xe2\x80\x98(.*)\xe2\x80\x99'

Если кавычки по-разному кодируются на разных платформах, то вы можете использовать чередование (например, (\xe2\x80\x98|...) вместо xe2\x80\x98) для сопоставления всех возможностей (и корректировки индекса, используемого для BASH_REMATCH).

См. Как отобразить 4-значный символ Unicode в Bash? для получения дополнительной информации о Unicode в Bash.

Я использовал $'...' для установки регулярного выражения, потому что оно поддерживает \x и (из Bash 4.2) \u экранирует символы, а регулярные выражения Bash - нет.

Что касается регулярного выражения:

1 голос
/ 15 марта 2019

Есть много способов сделать это, это один:

file=`echo "$var" | grep '^\* building' | grep -o '‘.*’' | head -c -4 | tail -c +4`
echo $file
  • Найти строку, начинающуюся с * building (первый grep)
  • Найти текст между ‘’ (второй grep)
  • Отменить кавычки (первые 4 байта и последние 4 байта) (голова и хвост)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...