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 - - - - 

โปรดทราบว่าบรรทัดที่สามเริ่มต้นด้วย > แสดงถึงบรรทัดที่เลือกสตริงที่ตรงกัน

ฉันกำลังพยายาม -replace บน > เพื่อแทนที่ด้วย ‹ font color="red">$1‹ /font> แต่การแทนที่ของฉันดูเหมือนจะไม่ทำงาน

นี่คือรหัสของฉัน:

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

กูรู PowerShell regex คนใดสามารถบอกฉันได้ไหมว่าทำไมนิพจน์ทั่วไปของฉันไม่ตรงกัน

ขอบคุณแบรด


person Brad    schedule 18.06.2012    source แหล่งที่มา
comment
รหัส: $list = gci $log_location -include ex*.log | โดยที่ { $_.LastWriteTime.Date -eq $yesterday} $results = cat $list | เลือกสตริง - รูปแบบ $error_codes - บริบท $num_lines_before,$num_lines_after | Foreach { $_.Context.PreContext ‹font color='red'›$($_.Line)‹/font› $_.Context.PostContext} | เรียงลำดับค่า   -  person Brad    schedule 18.06.2012


คำตอบ (2)


คุณควรเริ่มคิดแบบวัตถุมากกว่าข้อความ เพราะสิ่งที่คุณเห็นเป็นเพียงวัตถุที่มีการจัดรูปแบบ ไม่ใช่ผลลัพธ์ที่แท้จริงของ select-string แทนที่จะแยกวิเคราะห์ผลลัพธ์นี้ - ใช้วัตถุที่คุณได้รับ (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>"

เอชทีเอช บาร์เทค

person BartekB    schedule 18.06.2012
comment
สิ่งนี้สมเหตุสมผล แต่ PowerShell กำลังสำลักบางสิ่ง: โทเค็นที่ไม่คาดคิด '‹font color='red'›$($_.Line)‹/font›' ในนิพจน์หรือคำสั่ง ฉันพยายามหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยว วงเล็บเหลี่ยม ทุกสิ่งทุกอย่างที่ฉันคิดได้ ฉันยังลบอักขระพิเศษทั้งหมดออกและยังคงปิดปากอยู่ ฉันไม่แน่ใจว่าทำไมมันถึงโกรธ - person Brad; 18.06.2012
comment
แปลก... คุณสามารถโพสต์โค้ดทั้งหมดที่คุณใช้ได้หรือไม่? ดูเหมือนว่าคุณจะพลาดการขึ้นบรรทัดใหม่ที่ไหนสักแห่ง... นอกจากนี้ เพื่อให้แน่ใจว่าทั้งสองคำสั่งถูกแยกออกจากกัน คุณสามารถใช้เครื่องหมายอัฒภาคระหว่างทั้งสองได้ - person BartekB; 18.06.2012
comment
เพียงเพื่อให้แน่ใจว่าคุณ มี แยกสามคำสั่งใน foreach-object (และข้อผิดพลาดของคุณแนะนำว่าเป็นอย่างอื่น) - โปรดคั่นด้วยเครื่องหมายอัฒภาคและลอง than: foreach { $_.Context.PreContext; ‹font color='red'›$($_.Line)‹/font›; $_.บริบท.PostContext } - person BartekB; 18.06.2012
comment
อัฒภาค - นั่นคือปัญหา ขอบคุณมาก! - person Brad; 18.06.2012

หาก $a มีค่าของบรรทัดที่สามของคุณลอง:

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

สองสิ่ง :

  1. ใช้ qutes เดียวสำหรับ RegEx ของคุณ
  2. ดัชนีของกลุ่มเริ่มต้นที่ 1
person JPBlanc    schedule 18.06.2012
comment
สคริปต์ของฉันทำงานด้วยโค้ดด้านบน แต่ไม่ได้ทำการแทนที่จริง ๆ เพราะมันไม่ตรงกับสิ่งใดเลย :-\ - person Brad; 18.06.2012