正则表达式在PowerShell中使用GC的二进制文件

时间:2012-12-17 21:42:20

标签: powershell

问题:什么PowerShell正则表达式模式将返回类似Bash的字符串命令的输出?

我发现了一篇关于gc和Select-String的文章:Episode#137:Free-base64-ing。 http://blog.commandlinekungfu.com/2011/03/episode-137-free-base64-ing.html

我尝试了上一个问题中的一些正则表达式模式:正则表达式用于字母数字和下划线。 Regular Expression for alphanumeric and underscores

如果我在Bash中运行:strings --all myfile.bin 结果:52939行字符串。

gc。\ myfile.bin | Select-String -AllMatches“^ [a-zA-Z0-9 _] * $” 结果:一些空白行。

gc。\ myfile.bin | Select-String -AllMatches“^ \ w * $” 结果:9行字符和一些空行。

gc。\ myfile.bin | Select-String -AllMatches“^ \ w * $” 结果:9行字符。

gc。\ myfile.bin | Select-String -AllMatches“[A-Za-z0-9_]” 结果:几乎整个文件,不可打印的字符和所有。

gc。\ myfile.bin | Select-String -AllMatches“^ [\ p {L} \ p {Nd} _] + $” 结果:20行字符。

那么我失踪的正则表达技巧是什么?

2 个答案:

答案 0 :(得分:1)

你错过了二进制文件在文本文件的方式中不包含“行”。因此,^$对您没有任何好处。

虽然可能不是最优雅的解决方案,但这样的事情可能会:

cat .\myfile.bin `
  | % { $_ -replace '[^\w\d ]', "`n" } `
  | % { $_.Split("`n") } `
  | ? { $_ -match '.{3,}' } `
  | % { $_.Trim() }

或者,您可以使用Sysinternals'strings实用程序。

答案 1 :(得分:0)

如上所述,缺少换行符会阻止RegEx工作。 Microsoft Sysinternals的字符串实用程序是一个很好的解决方案。

如果您需要原生PowerShell解决方案,请ping我。我在C#中编写了一个Get-Strings cmdlet,它从二进制文件中提取ASCII(UTF8)和Unicode(UTF16)字符串。它没有Sysinternals那么快,但确实具有将输出放入PowerShell管道的优势。