2010-09-09 3 views
0

У меня есть строкаPowershell удалить текст из строки

[Test: ABC.Test (6)] MORETEXTGOESHERE [(null)] <(null)> - A red fox jumped the fence

и хотел обрезать строку, чтобы показывать только

A red fox jumped the fence

Что такое лучший способ пойти об этом. Я уверен, что справимся с SubStrings и IndexOfs, но, возможно, какое-то выражение в выражении regex может сделать трюк?

ответ

2

Использование подстроки вы можете сделать это:

PS> $str = '[Test: ABC.Test (6)] MORETEXTGOESHERE [(null)] <(null)> - ' +` 
      'A red fox jumped the fence' 
PS> $str.Substring($str.LastIndexOf('-')+2) 
A red fox jumped the fence 

Это немного хрупким, если обработка линии без каких-либо - символов. Вот регулярное выражение, которое будет работать:

PS> $str | Select-String '-\s*([^-]*)$' | Foreach{$_.Matches[0].Groups[1].Value} 
A red fox jumped the fence 

И если обработка построчно, мне нравится этот подход:

PS> if ($str -match '-\s*([^-]*)$') { $matches[1] } 
A red fox jumped the fence 

И с более реалистичной строки:

PS> $str = '2010-09-09 07:15:31,749 [ABC: TEST.TEST (3)] ABB MYCLASS.TEST ' +` 
      '[(null)] <(null)> - MessageId: ' +` 
      '46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED' 
PS> if ($str -match '- MessageId:\s*(.*)$') { $matches[1] } 
46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED 

или если вы не хотят СОЗДАВАТЬСЯ на выходе:

PS> if ($str -match '- MessageId:\s*(.*?)\s+CREATED\s*$') { $matches[1] } 
46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 
+0

Хм .. возможно, я не рисовал полную картину, извините. – Henno

+0

Вот пример реальной жизни 2010-09-09 07: 15: 31,749 [ABC: TEST.TEST (3)] ABB MYCLASS.TEST [(null)] <(null)> - MessageId: 46b8fd3c-9ce8-4699-9d1b-91f31bfb5c62 CREATED – Henno

+0

Вы хотите извлечь все из MessageId до конца или вы хотите оставить «CREATED»? –

1

Если ваша строка имеет фиксированный шаблон ... т. Е. текст, который вам интересен, всегда после < (null)>, и в тексте нет «>», а затем о разделении строки ввода на «>» и получении второго элемента массива.

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