Powershell从字符串中删除文本

时间:2010-09-09 02:27:24

标签: powershell

我有一个字符串

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

并希望将字符串修剪为仅显示

A red fox jumped the fence

最好的方法是什么。我确信我会使用SubStrings和IndexOf管理,但也许一些正则表达式可以解决这个问题?

2 个答案:

答案 0 :(得分: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

或者如果您不想在输出中使用CREATED:

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

答案 1 :(得分:1)

如果你的字符串有固定的模式......即。您感兴趣的文字总是在&lt;(null)&gt;之后,并且没有“&gt;”在文中,然后如何在“&gt;”上拆分输入行并返回数组的第二个元素。