Получить строку между 2 строками или разделителями в bash с помощью регулярных выражений - PullRequest
0 голосов
/ 31 мая 2018

Моя строка:

model_config_list: {
   config: {
       name: "123-model",
       base_path: "/modelServers/tests-integration/resources/models/123-model",
       model_platform: "tensorflow",
       model_version_policy: {
           all: {}
       }
   }

Я хочу извлечь:

/modelServers/tests-integration/resources/models/123-model

для этого я написал скрипт bash:

config_file=$(<conf.conf)
regex="(?<=base_path:)(.*)(?=,)"
if [[ $config_file =~ $regex ]];then echo ${BASH_REMATCH[1]}; fi

Однако яне получаю никакого выхода.Я новичок в написании сценариев Bash.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Bash не поддерживает косвенные утверждения.Но они вам не нужны:

regex='base_path: "([^"]*)"'
0 голосов
/ 31 мая 2018

Вам необходимо использовать регулярное выражение с группой захвата, а не обходные пути, которые не поддерживаются в Bash regex:

regex='base_path:[[:space:]]*"([^"]+)"'
if [[ $config_file =~ $regex ]];then 
  echo ${BASH_REMATCH[1]};
fi

Вывод:

/modelServers/tests-integration/resources/models/123-model

См. Bash demo online .

Подробности

Положительный (?<=base_path:) lookbehind и (?=,) lookahead не поддерживаются в Bash regex.Смысл здесь в том, чтобы сопоставить base_path: с любым пробелом после него, затем ", а затем включить в группу 1 любой один или несколько символов, отличных от " (используя выражение с отрицательными скобками [^"]+).

  • base_path: - буквенная подстрока
  • [[:space:]]* - 0+ пробельных символов
  • " - двойная кавычка
  • ([^"]+) -1 или более символов, отличных от " char
  • " - двойная кавычка.
...