grep上浮点数的正则表达式

时间:2016-07-31 18:28:10

标签: regex bash sed grep

I0709 13:45:33.848619  3415 upgrade_proto.cpp:1044] Attempting to upgrade input file specified using deprecated 'solver_type' field (enum)': models/model
I0709 20:02:09.081399  3415 solver.cpp:228] Iteration 101, loss = 2.25779
I0709 20:02:09.081477  3415 solver.cpp:244]     Train net output #0: loss = 2.25779 (* 1 = 2.25779 loss)
I0709 20:02:09.081495  3415 sgd_solver.cpp:106] Iteration 101, lr = 0.01
I0709 20:02:20.067615  3415 solver.cpp:228] Iteration 102, loss = 2.22583
I0709 20:02:20.067740  3415 solver.cpp:244]     Train net output #0: loss = 2.22583 (* 1 = 2.22583 loss)

从上面这样的文件中,我需要在这种情况下使用数字2.25779和2.22583,并将每个数据转储到新文件的一行上。

我尝试过类似的事情:

cat file.txt | grep -P 'loss = .*[0-9]\n' > res.csv

这与任何事都不匹配,我不知道如何更具体(只有数字而不是损失=)。

所以a:

 cat res.csv

应显示输出:

2.25779

2.22583

3 个答案:

答案 0 :(得分:0)

看起来这会对你有所帮助:

(?<!:)[0-9]+(\.[0-9]+)

它会匹配花车,但不会与微秒相匹配,就像那样:

20:02:09.081477

答案 1 :(得分:0)

您需要使用()

捕获组
loss = (\d*\.\d*)
  • ()是捕获的群组
  • \d*匹配任意长度的任何数字
  • \.匹配字符字面意思

Here是一个生活演示

答案 2 :(得分:0)

这适用于任何操作系统上的任何sed:

$ sed -n 's/.*loss = \([0-9.]*\)$/\1/p' file
2.25779
2.22583

只有GNU grep会支持您尝试使用的选项/语法,并且没有grep支持您实现仅输出部分匹配文本(这将需要grep没有的捕获组)的目标所需的内容。