Из вывода:

$ pyenv virtualenvs

Я хочу извлечь с помощью sed имена виртуальных сред, а также их путь. То же самое для среды по умолчанию помечено звездочкой. Результаты выглядят так:

 3.6.3/envs/venv_1 (created from /home/user/.pyenv/versions/3.6.3)
* anaconda3-5.0.0 (created from /home/user/.pyenv/versions/anaconda3-5.0.0)
 venv_py3.6.3__test_01 (created from /home/user/.pyenv/versions/3.6.3)

С PCRE в качестве аромата:

^\*\s([a-zA-Z0-9\.\-]*)\s\(created\sfrom\s([a-zA-Z0-9\.\-\/]*)

Я могу захватить обе группы без проблем:

Группа 1: анаконда3-5.0.0

Группа 2: /home/user/.pyenv/versions/anaconda3-5.0.0

(проверено на https://regex101.com)

но я не могу заставить его работать с sed.

До сих пор мне удавалось, например, для среды по умолчанию извлечь имя с помощью:

sed -e 's/^\*\s\(.*\)\s(created\(.*\)/\1/

anaconda3-5.0.0

но для пути я получаю с:

sed -e 's/^\*\s\(.*\)\s(created\sfrom\s\(.*\)/\2/' 

/home/user/.pyenv/versions/anaconda3-5.0.0)

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

Любые идеи, как можно заставить его работать с sed?

ОБНОВИТЬ:

На данный момент у меня есть это:

для имен:

$ pyenv virtualenvs | sed -r 's/\(created\s*from\s*//g;s/\)//g;s/^\s*//g' | awk '{print $1}'

для путей:

$ pyenv virtualenvs | sed -r 's/\(created\s*from\s*//g;s/\)//g;s/^\s*//g' | awk '{print $2}'

1 ответ1

1

Я бы использовал простой perl oneliner:

Дано:

cat file
 3.6.3/envs/venv_1 (created from /home/user/.pyenv/versions/3.6.3)
* anaconda3-5.0.0 (created from /home/user/.pyenv/versions/anaconda3-5.0.0)
 venv_py3.6.3__test_01 (created from /home/user/.pyenv/versions/3.6.3)

Бег:

cat file | perl -ane 'print "$1\n$2\n" if m#^\*?\h+(\S+)\h+\(created from ([\w/.-]+)#'
3.6.3/envs/venv_1
/home/user/.pyenv/versions/3.6.3
anaconda3-5.0.0
/home/user/.pyenv/versions/anaconda3-5.0.0
venv_py3.6.3__test_01
/home/user/.pyenv/versions/3.6.3

Конечно, замените cat file на pyenv virtualenvs

Regex объяснение:

m#                      : match, regex delimiter
    ^                   : beginning of line
      \*?               : an optional asterisk
      \h+               : 1 or more horizontal spaces (i.e. space or tab)
      (\S+)             : group 1, 1 or more non space characters
      \h+               : 1 or more horizontal spaces (i.e. space or tab)
      \(created from    : literally
      ([\w/.-]+)        : group 2, 1 or more word char, slash, dot, minus
#                       : regex delim

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .