регулярное выражение sed для нежадной замены?

Мне известен другой вопрос, который очень похож, но по какой-то причине я у меня все еще есть проблемы.

У меня есть журнал GC, в котором я пытаюсь вырезать раздел Tenured, заключенный в [].

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]

Я подаю заявку s/\[Tenured:.*\]//

И вполне ожидаемо результат жадно обрезается до конца строки:

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546:

Итак, давайте попробуем не жадничать, не сопоставлять закрывающую правую скобку с s/\[Tenured:[^\]]*\]//, но, увы, совпадения не происходит, и sed пропускает строку, создавая тот же исходный результат:

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]

Как мне не жадно сопоставить и заменить этот раздел? Спасибо,


person Jé Queue    schedule 06.11.2009    source источник


Ответы (4)


Почти: s/\[Tenured:[^]]*\]//

В руководстве говорится:

Чтобы включить литерал ']' в список, сделайте его первым символом (после возможного '^').

т. е. в этом контексте не требуется обратная косая черта.

  • Раз
person Roland Turner    schedule 06.11.2009

sed -e 's/\[Tenured:[^]]*\]//'

По-видимому, вы не должны избегать закрывающей квадратной скобки. дурацкий!

От man re_format:

Выражение в квадратных скобках представляет собой список символов, заключенных в '[]'... Чтобы включить литерал ']' в список, сделайте его первым символом (после возможного `^').

person Laurence Gonsalves    schedule 06.11.2009
comment
Вау, это дико. Я знал о ситуации ^, но не знал о ситуации ]. - person Jé Queue; 06.11.2009

Попробуйте .*? для нежадного варианта .*. (Не уверен, поддерживается ли это в движке регулярных выражений sed или нет, но попробовать стоит.)

Изменить: этот предыдущий вопрос SO может быть актуальным - Нежадное сопоставление регулярных выражений в sed?

person Amber    schedule 06.11.2009
comment
Я не верю, что sed поддерживает это, но, тем не менее, я просто попробовал еще раз и не получил удовольствия. - person Jé Queue; 06.11.2009
comment
См. упомянутый вопрос stackoverflow.com/questions/1103149 / - person Krzysztof Wolny; 05.01.2012
comment
sed поддерживает его с флагами -r (GNU) или -E (BSD). - person Will Tice; 22.07.2013

Это сработало:

echo "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]" | sed -e s/\\[Tenured:[^\]]*\\]//
person Community    schedule 06.11.2009
comment
Я думаю, что это работает, потому что оболочка выполняла экранирование до того, как попала в sed. К сожалению, то же самое было бы неверно для файла сценария sed. - person Jé Queue; 06.11.2009