English 中文(简体)
Extract float from text line with sed?
原标题:

I am issuing a sed replace on a line, trying to extract a particular floating-point value, but all that appears to be matched is the right-side of the decimal

Text Line:

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]

If I issue s/^.*([0-9]*.[0-9]*): [Tenured:.*$/1/, my output is:

.546

I m wanting the 63.546 out of the line. Why is the very first [0-9]* not matching?

最佳回答

Also match the ] before the number you want:

s/^.*]([0-9]*.[0-9]*): [Tenured:.*$/1/

Per comment below, here is a more generic approach, matching a non-digit first:

s/^.*[^0-9]([0-9]*.[0-9]*): [Tenured:.*$/1/
问题回答

My feeling is that your .* at the beginning is acting greedy, so it absorbs everything up to the dot, but I could be wrong.

Don t use sed. I gave up on this. perl is a better choice (I was starting to play with it) but the solution with awk beats me. Go for that, unless you really love sed for some particular reason...

use awk instead sed. why bother creating complex regex?

$ more file
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]

$ awk -vRS="]" -F":"  $1+0==$1{print $1}  file
63.544
63.546

As Stefano pointed out, the pattern is performing a greedy match at the beginning of your text input.

If you can use perl, this command works to match your line on standard input:

perl -e  <STDIN> =~ m/^.*?([d]+.[d]+):s+[Ten/ && print "$1
"; 




相关问题
Uncommon regular expressions [closed]

Recently I discovered two amazing regular expression features: ?: and ?!. I was curious of other neat regex features. So maybe you would like to share some tricky regular expressions.

regex to trap img tag, both versions

I need to remove image tags from text, so both versions of the tag: <img src="" ... ></img> <img src="" ... />

C++, Boost regex, replace value function of matched value?

Specifically, I have an array of strings called val, and want to replace all instances of "%{n}%" in the input with val[n]. More generally, I want the replace value to be a function of the match ...

PowerShell -match operator and multiple groups

I have the following log entry that I am processing in PowerShell I m trying to extract all the activity names and durations using the -match operator but I am only getting one match group back. I m ...

Is it possible to negate a regular expression search?

I m building a lexical analysis engine in c#. For the most part it is done and works quite well. One of the features of my lexer is that it allows any user to input their own regular expressions. This ...

regex for four-digit numbers (or "default")

I need a regex for four-digit numbers separated by comma ("default" can also be a value). Examples: 6755 3452,8767,9865,8766,3454 7678,9876 1234,9867,6876,9865 default Note: "default" ...

热门标签