1

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

我发现了一篇关于 gc 和 Select-String 的文章:第 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 行字符。

那么我缺少的正则表达式技巧是什么?

4

2 回答 2

1

您错过了二进制文件不像文本文件那样由“行”组成。因此^$在这里对你没有任何好处。

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

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

或者,您可以使用 Sysinternals 的字符串实用程序。

于 2012-12-17T22:57:49.907 回答
0

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

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

于 2012-12-19T12:27:36.253 回答