sed regex to non-greedy replace?
Solution 1
Almost: s/\[Tenured:[^]]*\]//
The manual says:
To include a literal ']' in the list, make it the first character (following a possible '^').
i.e. No backslash is required in this context.
- Raz
Solution 2
sed -e 's/\[Tenured:[^]]*\]//'
Apparently you shouldn't escape the close square bracket. Wacky!
From man re_format
:
A bracket expression is a list of characters enclosed in '[]' ... To include a literal ']' in the list, make it the first character (following a possible `^').
Jé Queue
Updated on June 04, 2022Comments
-
Jé Queue almost 2 years
I am aware of another question that is quite similar, but for some reason I'm still having problems.
I have a GC log that I'm trying to trim out the Tenured section enclosed in
[]
.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]
I apply
s/\[Tenured:.*\]//
And quite expectantly, the result is trimmed greedily through the remainder of the line:
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546:
So let's try and be non-greedy not match a closing right bracket with
s/\[Tenured:[^\]]*\]//
but alas no match is made and sed skips over the line, producing the same original output: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]
How do I non-greedily match and replace that section? Thanks,
-
Jé Queue over 14 yearsI don't believe sed supports that, but regardless I just tried it again and no joy.
-
Jé Queue over 14 yearsWow, that is wacky. I knew about the
^
situation, but not the]
. -
Krzysztof Wolny over 12 yearsSee mentioned question stackoverflow.com/questions/1103149/…
-
Will Tice almost 11 yearssed supports it with the -r (GNU) or -E (BSD) flags.