首页 > 解决方案 > Powershell RegEx 在空行之后包含所有输出

问题描述

我正在运行一个 exe,它在控制台中获取版本信息和输出。我想将输出保存到一个变量中,但我需要排除空行之前的所有内容,如果可能的话,删除空行之后输出开头的数字,但可以不这样做。我认为那部分会更容易,但我不知道如何在空白之前排除事物。

这是我的输出。它作为字符串返回。

1     USB Receiver                                                                                                                                                        
1.1   M525 [off-line]
1.2   M525

1     RQR24.06_B0030
1.1   [off-line]
1.2   RQM27.02_B0028

因此,我一直在尝试使用带有 select-string 的模式来仅在空格后获取输出,但没有任何效果。我希望最终只得到没有前导数字的输出,但只在空白行上工作。所以它看起来像这样:

1     RQR24.06_B0030
1.1   [off-line]
1.2   RQM27.02_B0028

是否有捷径可寻?我尝试过的其他人继续在输出顶部添加一个空格。

标签: regexpowershell

解决方案


# Multi-line input string.
$str = @'
1     USB Receiver
1.1   M525 [off-line]
1.2   M525

1     RQR24.06_B0030
1.1   [off-line]
1.2   RQM27.02_B0028
'@

# Get everything starting with the line after the first empty line,
# split it into individual lines, then remove the first token and subsequent
# whitespace from each line.
($str -split '\r?\n\r?\n', 2)[1] -split '\r?\n' -replace '^[^ ]+ +'

注意:如果您的输入来自文件,请替换$str(Get-Content -Raw file.txt)

以上产生(一个字符串数组,每个元素在自己的行上):

RQR24.06_B0030
[off-line]
RQM27.02_B0028

解释:

  • $str -split '\r?\n\r?\n', 2将输入拆分为前两个连续的换行符(\r?\n匹配 Windows 样式的 CRLF 和 Unix 样式的 LF-only 换行符);2表示最多应创建 2 个令牌。

  • (...)[1]提取第二个标记,即第一个空行之后的所有内容。

  • -split '\r?\n'将生成的标记拆分为单独的行

  • -replace '^[^ ]+ +'有效地从每行删除第一个标记以及它后面的空格,只留下第二个空格分隔的标记。


推荐阅读