使用正则表达式获取两个字符串之间的数字值

时间:2017-03-24 15:25:08

标签: regex sed sh

我有一个包含多个值输出的字符串,如下所示:

SD performance read=1450kB/s write=872kB/s no error (0 0), ManufactorerID 27 Date 2014/2 CardType 2 Blocksize 512 Erase 0 MaxtransferRate 25000000 RWfactor 2 ReadSpeed 22222222Hz WriteSpeed 22222222Hz MaxReadCurrentVDDmin 3 MaxReadCurrentVDDmax 5 MaxWriteCurrentVDDmin 3 MaxWriteCurrentVDDmax 1

我想使用bash和sed仅输出读取值(1450kB / s)。 我试过了

 sed 's/read=\(.*\)kB/\1/'

但输出读数= 1450kB,但我只想要数字。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

示例输入缩短为演示:

$ echo 'SD performance read=1450kB/s write=872kB/s no error' | sed 's/read=\(.*\)kB/\1/'
SD performance 1450kB/s write=872/s no error

$ echo 'SD performance read=1450kB/s write=872kB/s no error' | sed 's/.*read=\(.*\)kB.*/\1/'
1450kB/s write=872

$ echo 'SD performance read=1450kB/s write=872kB/s no error' | sed 's/.*read=\([0-9]*\)kB.*/\1/'
1450
  • 由于必须更换整行,因此请在搜索模式
  • 之前和之后添加.*
  • *贪婪,会尝试尽可能匹配,所以在第二个例子中可以看出它甚至匹配write
  • 的值
  • 由于只需要read=之后的数字,因此请使用[0-9]代替.

答案 1 :(得分:1)

运行

sed 's/read=\(.*\)kB/\1/'

read=[digits]kB替换为[digit]。如果要替换整个字符串,请使用

sed 's/.*read=\([0-9]*\)kB.*/\1/'

代替。

正如Sundeep注意到的那样,sed不支持非贪婪模式,而是更新为[0-9]*