问题:什么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行字符。
那么我失踪的正则表达技巧是什么?
答案 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管道的优势。