Powershell заменить Regex

У меня есть строка выбора, которая ищет журнал IIS для конкретной строки и возвращает 2 строки выше и одну строку ниже. Итак, результаты выглядят так:

2012-06-15 18:26:09 98.138.206.39 OutboundConnectionResponse SMTPSVC1 WEB10 - 25 - - 220+mta1083.sbc.mail.ne1.yahoo.com+ESMTP+YSmtp+service+ready 0 0 60 0 218 SMTP - - - -
2012-06-15 18:26:09 98.138.206.39 OutboundConnectionCommand SMTPSVC1 WEB10 - 25 EHLO - WEB10.DOMAIN>COM 0 0 4 0 218 SMTP - - - -
> 2012-06-15 18:26:09 74.125.244.10 OutboundConnectionResponse SMTPSVC1 WEB10 - 25 - - 550+IP+Authorization+check+failed+-+psmtp 0 0 41 0 218 SMTP - - - -
2012-06-15 18:26:09 74.125.244.10 OutboundConnectionCommand SMTPSVC1 WEB10 - 25 RSET - - 0 0 4 0 218 SMTP - - - - 

Обратите внимание, что третья строка начинается с символа>, обозначающего строку, с которой совпала строка выбора.

Я пытаюсь выполнить замену на>, чтобы заменить его на ‹font color =" red "> $ 1‹ / font>, но моя замена, похоже, не работает.

Вот мой код:

$results = $results -replace "(^> )(.*)$", "< font color='red'>$1< font>" 

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

Спасибо, Брэд


person Brad    schedule 18.06.2012    source источник
comment
Код: $ list = gci $ log_location -include ex * .log | где {$ _. LastWriteTime.Date -eq $ вчера} $ results = cat $ list | select-string -pattern $ error_codes -Context $ num_lines_before, $ num_lines_after | Для каждого {$ _. Context.PreContext ‹font color = 'red'› $ ($ _. Line) ‹/font› $ _. Context.PostContext} | значение сортировки   -  person Brad    schedule 18.06.2012


Ответы (2)


Вам следует начать думать об объекте, а не о тексте, потому что то, что вы видите, - это только сформированный объект, а не фактический вывод строки выбора. Вместо анализа этого вывода используйте полученные объекты (Get-Member позволит вам их обнаружить).

Я думаю, это должно сделать то, что вам нужно:

# Prepare test data...
$tring = @'
alfa
beta
gamma
delta
alfa
beta
alfa
beta
'@.Split("`n")

# Display results with actually matching line highlighted in red...
"<body>"
$tring | select-string 'delta' -Context 2,2 | foreach {
    $_.Context.PreContext
    "<font color='red'>$($_.Line)<font>"
    $_.Context.PostContext
}
"</body>"

HTH Bartek

person BartekB    schedule 18.06.2012
comment
В этом есть смысл, но PowerShell чем-то задыхается: Unexpected token '‹font color = _1 _'› $ ($ _. Line) ‹/font› 'в выражении или заявлении. Я пробовал избегать одинарных кавычек, угловых скобок, всего, что я мог придумать. Я даже удалил все спецсимволы, но все равно прикол. Я не уверен, почему это злится. - person Brad; 18.06.2012
comment
Странно ... вы можете опубликовать весь код, который используете? Похоже, вам где-то не хватает новой строки ... Кроме того, чтобы убедиться, что оба оператора разделены, вы можете использовать точку с запятой между ними. - person BartekB; 18.06.2012
comment
Чтобы быть уверенным, что вы разделили три оператора в foreach-object (и ваша ошибка предполагает иное) - разделите их точкой с запятой и попробуйте, чем: foreach {$ _. Context.PreContext; ‹Цвет шрифта = 'красный'› $ ($ _. Line) ‹/font›; $ _. Context.PostContext} - person BartekB; 18.06.2012
comment
Точка с запятой - вот в чем проблема. Большое спасибо! - person Brad; 18.06.2012

Если $ a содержит значение вашей третьей строки, попробуйте:

$a -replace '(^>)(.*)','font color="red">$2<font/>'

Две вещи :

  1. Используйте одиночные кавычки для вашего RegEx
  2. Индекс групп начинается с 1
person JPBlanc    schedule 18.06.2012
comment
Мой скрипт работает с приведенным выше кодом, но на самом деле он не выполняет замену, потому что он ничего не соответствует: - \ - person Brad; 18.06.2012