【问题标题】:Powershell: Combine next line with current linePowershell:将下一行与当前行合并
【发布时间】:2020-05-26 00:49:54
【问题描述】:

我正在寻找所需的输出,如下所示。主要概念是将下一行与当前行连接起来,如果以字符结尾,则结果为一行。

谢谢

$file = 'textfile.txt'
$reportObject = @() 

foreach ($line in $file) {

  $content = [IO.File]::ReadAllLines($file)

  for ($i = 0; $i -lt $content.count; $i++) {

    $line = $content[$i]

    if ($line.StartsWith("Users")) {

      $a = 0

      while ($content[$i + $a].EndsWith("\")) {                                                #"

        $reportObject += $content[$i + $a]

        $a++

      }

      $reportObject += $content[$i + $a]

    }

  }
  $reportObject
}

【问题讨论】:

  • 你为什么要为每一行重复读取整个文件?
  • 你有更好的办法吗?请分享。谢谢。

标签: powershell text-parsing


【解决方案1】:
# Use
#   $reportObject = (Get-Content ...
# to assign the resulting array of lines to your variable.
(Get-Content -Raw textfile.txt) -replace '\\\r?\n' -split '\r?\n'
  • Get-Content -Raw textfile.txt 将整个文件读入单个多行字符串,因为使用了Get-Content-Raw 开关。

  • -replace '\\\r?\n' 替换 \ 字符。 (转义为 \\)后跟换行符 (\r?\n)[1] 与(隐含的)空字符串,因此有效地删除匹配的序列。

    • 有关基于正则表达式的-replace 运算符的更多信息,请参阅this answer
  • -split '\r?\n' 将生成的字符串拆分回单个行的数组。

    • 有关基于正则表达式的-split 运算符的更多信息,请参阅about_Split

注意:如果输入文件有一个尾随换行符,则上述数组的末尾将有一个额外的 empty 元素:

  • 如果输入中没有 other 空行(您需要保留),您只需将-ne '' 附加到上述命令即可删除所有空字符串元素。

  • 要仅删除 last 元素,最简单(尽管不是最有效)的解决方案是附加
    | Select-Object -SkipLast 1 - 请参阅Select-Object 的文档。


[1] 这个正则表达式是匹配换行符的跨平台方式:它匹配 Windows 样式的 CRLF 序列 (\r\n) 和 Unix 样式的 LF-only (\n) 换行符。

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-05-07
    相关资源
    最近更新 更多