从输出来看:
$ 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 为 FLAVOR:
^\*\s([a-zA-Z0-9\.\-]*)\s\(created\sfrom\s([a-zA-Z0-9\.\-\/]*)
我可以毫无问题地捕获这两个组:
第 1 组:anaconda3-5.0.0
第 2 组:/home/用户/.pyenv/版本/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/用户/.pyenv/版本/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
我会使用一个简单的 perl 单行代码:
鉴于:
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
正则表达式解释:
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