sed regex to non-greedy replace?

10,009

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 `^').

Share:
10,009
Jé Queue
Author by

Jé Queue

Updated on June 04, 2022

Comments

  • Jé Queue
    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
    Jé Queue over 14 years
    I don't believe sed supports that, but regardless I just tried it again and no joy.
  • Jé Queue
    Jé Queue over 14 years
    Wow, that is wacky. I knew about the ^ situation, but not the ].
  • Krzysztof Wolny
    Krzysztof Wolny over 12 years
  • Will Tice
    Will Tice almost 11 years
    sed supports it with the -r (GNU) or -E (BSD) flags.