Я получаю пустое эхо от регулярного выражения

Если я запускаю этот файл, он работает нормально и выводит ожидаемые строки:

workspaceFile=`cat tensorflow/workspace.bzl`
echo $workspaceFile | grep -oP '\/[a-z0-9]{12}.tar.gz'

Однако, если я запустил это, все, что я получил, это пустой вывод в терминале:

workspaceFile=`cat tensorflow/workspace.bzl`
TAR_FILE_WITH_SLASH=$workspaceFile | grep -oP '\/[a-z0-9]{12}.tar.gz'
echo $TAR_FILE_WITH_SLASH

Файл довольно длинный, поэтому для простоты я добавлю здесь сокращенную версию:

tf_http_archive(
  name = "eigen_archive",
  urls = [
    "https://mirror.bazel.build/bitbucket.org/eigen/eigen/get/6913f0cf7d06.tar.gz",
    "https://bitbucket.org/eigen/eigen/get/6913f0cf7d06.tar.gz",
  ],

Используйте TAR_FILE_WITH_SLASH="$(echo $workspaceFile | grep -oP '/[a-z0-9]{12}\.tar\.gz')"

Wiktor Stribiżew 10.09.2018 10:53
2
1
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что насчет пути?

workspaceFile=`cat ~/tensorflow/workspace.bzl`
Ответ принят как подходящий

Вам нужно использовать синтаксис $(), вывести содержимое workspaceFile и затем передать команду grep по конвейеру:

TAR_FILE_WITH_SLASH="$(echo $workspaceFile | grep -oE '/[a-z0-9]{12}\.tar\.gz')"

Также обратите внимание, что здесь вам не нужно регулярное выражение PCRE, вы можете использовать регулярное выражение POSIX ERE (то есть заменить P на E). Вы даже можете использовать здесь шаблон POSIX BRE, например grep -o '/[a-z0-9]\{12\}\.tar\.gz'. Точка должна быть экранирована, чтобы соответствовать буквальной точке, и / здесь не особенный и не требует экранирования.

См. онлайн-демонстрация.

Я знаю, что это дополнительный вопрос, но окончательный желаемый результат будет только 1 с удаленным ведущим "/"?

Steve 10.09.2018 11:31

Вы имеете в виду, что хотите избавиться от /? Используйте grep -oP '/\K[a-z0-9]{12}\.tar\.gz'

Wiktor Stribiżew 10.09.2018 11:31

Да, именно так, и чтобы соответствовать только первому вхождению регулярного выражения (в этом конкретном примере их 2).

Steve 10.09.2018 11:32

Хорошо, используйте grep -oP '/\K[a-z0-9]{12}\.tar\.gz' | head -1.

Wiktor Stribiżew 10.09.2018 11:33

Отлично спасибо! Человек, я хотел бы получить ваши знания о регулярных выражениях :)

Steve 10.09.2018 11:35

Другие вопросы по теме