2009-11-06 4 views
4

Я знаю another question, что очень похоже, но по какой-то причине у меня все еще возникают проблемы.sed regex to non-greedy заменить?

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

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] 

Как я не жадно подхожу и заменяю этот раздел? Спасибо,

ответ

5

Почти: s/\ [ординарный: [^]] * \] //

Руководство говорит:

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

В этой связи не требуется обратная косая черта.

  • Raz
0

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

Edit: Это предыдущий SO вопрос может быть актуальным - Non greedy regex matching in sed?

+1

Я не верю, что SED поддерживает это, но независимо от того, я просто попытался его снова и никакой радости. – Xailor

+0

См. Элемент SO, связанный в моем редактировании. – Amber

+0

См. Упомянутый вопрос http://stackoverflow.com/questions/1103149/non-greedy-regex-matching-in-sed –

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

Видимо, вы не должны бежать закрытая квадратная скобка. Необычное!

От man re_format:

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

+0

Вау, это дурацкий. Я знал о ситуации '^', но не '' '. – Xailor

0

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

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:[^\]]*\\]// 
+0

Я думаю, что это работает, потому что оболочка делала экранирование до того, как попала в sed. То же самое было бы не к сожалению для файла сценария sed. – Xailor

Смежные вопросы