【问题标题】:get number value between two strings using regex使用正则表达式获取两个字符串之间的数值
【发布时间】:2017-08-17 14:53:35
【问题描述】:

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

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/'

但输出 read=1450kB 但我只想要数字。 感谢您的帮助。

【问题讨论】:

  • 你得到的输出看起来不正确.. 例如: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
  • 只获取号码,试试sed 's/.*read=\([0-9]*\)kB.*/\1/'
  • 如果您需要awk,请使用此awk '{print $3}' test.txt | awk -F "=" '{print $2}'
  • 这正是我想要的,谢谢!

标签: regex sed sh


【解决方案1】:

跑步

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

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

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

改为。

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

【讨论】:

    【解决方案2】:

    为演示缩短了示例输入:

    $ 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] 而不是.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      相关资源
      最近更新 更多