我试图提取一个如下所示的数字,但没有任何信息被打印在屏幕上:
echo "This is an example: 65 apples" | sed -n 's/.*([0-9]*) apples/1/p'
但是,如果两位数字分别如下所示匹配,则会得到“65”
echo "This is an example: 65 apples" | sed -n 's/.*([0-9][0-9]) apples/1/p' 65
我怎么能匹配一个数字,我不知道一个数字中的数字位数,例如它可以是2344而不是65?
如何在linuxterminal上通过卷ID获得ubi卷名?
virtualenv与所有的Python库
我如何从我的串行端口始终logging数据?
防止我的node.js应用被操作系统杀死
“无法访问jarfile”在Linux的土地
创build目录时发生java.security错误(Linux)
Skype4Py:无法授权传入的好友请求
如何在使用mmap()时避免caching
linux在jiffies中如何处理溢出?
未定义的引用mbind
$ echo "This is an example: 65 apples" | sed -r 's/^[^0-9]*([0-9]+).*/1/' 65
这是因为你的第一个.*是贪婪的 ,你的[0-9]*允许有0或更多的数字。 因此, .*尽可能多的(包括数字)和[0-9]*什么都不匹配。
你可以做:
echo "This is an example: 65 apples" | sed -n 's/.*b([0-9]+) apples/1/p'
在那里我强制[0-9]至少匹配一个数字,并且在数字之前添加了一个字边界,以便整个数字匹配。
但是,使用grep比较容易,只要匹配数字:
echo "This is an example: 65 apples" | grep -P -o '[0-9]+(?= +apples)'
-P意思是“Perl正则表达式”(所以我不必担心逃脱“+”)。
-o表示“只打印匹配”。
(?= +apples)意思是苹果词后面的数字相匹配。
你所看到的是正则表达式的贪婪行为。 在你的第一个例子中, .*吞噬所有的数字。 这样的事情是这样的:
echo "This is an example: 65144 apples" | sed -n 's/[^0-9]*([0-9]+) apples/1/p' 65144
这样,你不能匹配在第一位的任何数字。 一些正则表达式有一种方法来要求非贪婪的匹配,但我不相信sed有一个。
echo "1213 test 456 test 789" | grep -P -o "d+"
结果是:
1213 456 789
echo "This is an example: 65 apples" | ssed -nR -e 's/.*?b([0-9]*) apples/1/p'
但是,你需要超级sed才能工作。 -R允许perl正则表达式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。