微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sed提取组数字

我试图提取一个如下所示的数字,但没有任何信息被打印在屏幕上:

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] 举报,一经查实,本站将立刻删除。

相关推荐