使用 sed 的正则表达式(提取捕获组)

使用 sed 的正则表达式(提取捕获组)

从输出来看:

$ 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 filepyenv 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

相关内容