首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有任何针对grep的命名正则表达式捕获?

问是否有任何针对grep的命名正则表达式捕获?
EN

Stack Overflow用户
提问于 2015-06-28 01:29:01
回答 2查看 214关注 0票数 3

我想知道是否可以使用grep -P(linux )从非格式化字符串中获得命名正则表达式?好吧..。从任何字符串

例如:将John Smith www.website.com john@website.com jan-01-2001捕获为

代码语言:javascript
复制
$name
$website
$email
$date

但似乎我不能从输出中传递任何变量?

echo "www.website.com" | grep -Po '^(www\.)?(?<domain>.+)$' | echo $domain

无输出

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-28 02:04:09

不是的。grep是一个过程。你说的是从孩子到父母的环境传播。那是禁止的。

相反,你可以

代码语言:javascript
复制
DATA=($your_line)

然后带着name=DATA[0]来回走。

或者另一种使用awk的方法:

代码语言:javascript
复制
eval "`echo $your_line | awk '
    function escape(s)
    {
        gsub(/'\''/,"'\''\"'\''\"'\''", s);
        s = "'\''"s"'\''";
        return s;
    }
    { 
        print "name="escape($1);
        print "family_name="escape($2);
        print "website="escape($3);
        print "email="escape($4);
        print "date="escape($5);
    }'`"

这里的意思是通过stdout传播信息,并在父环境中对其进行评估。

注意,在这里,转义函数将正确地转义任何字符串,使任何字符串都不会被错误地解释(就像引号的邪恶)。

以下是我杰西的作品:

代码语言:javascript
复制
name='John'
family_name='Smith'
website='www.website.com'
email='john@website.com'
date='jan-01-2001'

如果姓氏为O'Reilly,则该结果仍将是正确的:

代码语言:javascript
复制
name='John'
family_name='O'"'"'Reilly'
website='www.website.com'
email='john@website.com'
date='jan-01-2001'
票数 4
EN

Stack Overflow用户

发布于 2015-06-28 04:18:15

Grep是一个独立的命令行实用程序;它不在bash内部运行。所以它不能创建bash变量,即使它想要创建。

然而,bash有一个正则表达式匹配器内置。它不是一个与perl兼容的regex匹配器,所以它不实现命名捕获。(准确地说,它与Posix扩展正则表达式匹配,与grep -E相同。)但它确实实现了编号捕获。

在=~复合命令语法中执行与[[ ... ]]运算符匹配的正则表达式。如果正则表达式匹配,则表达式成功,捕获将插入数组变量BASH_REMATCH。${BASH_REMATCH[0]}将是整个匹配的子字符串,其余的元素(从${BASH_REMATCH[1]}开始)将是按顺序捕获的单个元素。

例如:

代码语言:javascript
复制
$ url=www.example.com
$ [[ $url =~ ^(www\.)?(.*) ]]
$ echo "${BASH_REMATCH[1]}"
www.
$ echo "${BASH_REMATCH[2]}"
example.com
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31095282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档