我想知道是否可以使用grep -P(linux )从非格式化字符串中获得命名正则表达式?好吧..。从任何字符串
例如:将John Smith www.website.com john@website.com jan-01-2001捕获为
$name
$website
$email
$date但似乎我不能从输出中传递任何变量?
echo "www.website.com" | grep -Po '^(www\.)?(?<domain>.+)$' | echo $domain
无输出
发布于 2015-06-28 02:04:09
不是的。grep是一个过程。你说的是从孩子到父母的环境传播。那是禁止的。
相反,你可以
DATA=($your_line)然后带着name=DATA[0]来回走。
或者另一种使用awk的方法:
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传播信息,并在父环境中对其进行评估。
注意,在这里,转义函数将正确地转义任何字符串,使任何字符串都不会被错误地解释(就像引号的邪恶)。
以下是我杰西的作品:
name='John'
family_name='Smith'
website='www.website.com'
email='john@website.com'
date='jan-01-2001'如果姓氏为O'Reilly,则该结果仍将是正确的:
name='John'
family_name='O'"'"'Reilly'
website='www.website.com'
email='john@website.com'
date='jan-01-2001'发布于 2015-06-28 04:18:15
Grep是一个独立的命令行实用程序;它不在bash内部运行。所以它不能创建bash变量,即使它想要创建。
然而,bash有一个正则表达式匹配器内置。它不是一个与perl兼容的regex匹配器,所以它不实现命名捕获。(准确地说,它与Posix扩展正则表达式匹配,与grep -E相同。)但它确实实现了编号捕获。
在=~复合命令语法中执行与[[ ... ]]运算符匹配的正则表达式。如果正则表达式匹配,则表达式成功,捕获将插入数组变量BASH_REMATCH。${BASH_REMATCH[0]}将是整个匹配的子字符串,其余的元素(从${BASH_REMATCH[1]}开始)将是按顺序捕获的单个元素。
例如:
$ url=www.example.com
$ [[ $url =~ ^(www\.)?(.*) ]]
$ echo "${BASH_REMATCH[1]}"
www.
$ echo "${BASH_REMATCH[2]}"
example.comhttps://stackoverflow.com/questions/31095282
复制相似问题