代码之家  ›  专栏  ›  技术社区  ›  Jacobm001

正在替换PowerShell中的“,\r\n”

  •  4
  • Jacobm001  · 技术社区  · 7 年前

    ,\r\n 在它里面。不管我做什么,它什么也做不了。我试着把这个表达 [] 这使得它取代了每一个逗号。这意味着问题在于它不能匹配换行符。

    \r\n , \n\r \n .

    (Get-Content file.txt) | ForEach-Object { $_ -replace '\,\r\n', [System.Environmen
    t]::NewLine } | Set-Content file2.txt
    

    我正在使用PowerShell版本5.1.15063.413

    2 回复  |  直到 7 年前
        1
  •  6
  •   Jacobm001    7 年前

    PowerShell非常。。。 特殊的

    Get-Content 默认情况下,返回字符串数组。它查找所有新行字符,并使用它们将输入拆分到所述数组中。这意味着没有新行可供regexp匹配。

    使用 -Raw

    (Get-Content file.txt -Raw).replace(",`r`n", [System.Environment]::NewLine) | Set-Content file2.txt
    
        2
  •  1
  •   mklement0    3 年前

    的确 Get-Content 默认情况下,读取并发出输入文件的内容 逐字逐句地 .

    不熟悉 用于处理管道中的文件。

    your answer 显示, -Raw 可用于读取文件 ,作为 相反,这可以提供很好的 .

    举一个例子 方便 阅读可以提供 ,与基于正则表达式的 -replace operator 每个元素 输入的 (如果您的文件有LF( \n \r\n )行尾前面有 , ,但这没有帮助):

    # Convenient, but can be made faster with -ReadCount 0 - see below.
    @(Get-Content file.txt) -replace ',$' | Set-Content file2.txt
    

    注: @(...) 这个 array-subexpression operator 获取内容 大堆 即使文件刚好有

    正则表达式锚点 $ 匹配每个输入字符串(行)的末尾,实际上是删除 拖尾 , .


    获取内容 性能说明

    如上所述, -生的 方法 读取文本文件 -但是出于设计 作为单个多行字符串 .

    默认行为, 逐行阅读很慢 ,不仅仅是因为 PowerShell装饰 使用元数据 [1] -生的 ,因为只有 输出字符串,仅发生这种情况 一旦 ).

    然而,你可以 通过阅读文字来加快速度 -给定大小的行数组-使用 -ReadCount 参数 ,在这种情况下,仅装饰每个阵列,而不是单个线。 -ReadCount 0 读取 全部的

    • -读取计数 更改流行为 :然后发送每个阵列 通过管道 接收命令需要计划 ,通常通过对接收到的数组执行自己的枚举,例如使用 foreach loop

    • 相比之下,使用 -读取计数0 结果 行为差异,这意味着它可以作为 简单的性能优化,不需要表达式的其他部分来适应它 操作示例:

      # Read all lines directly into an array, with -ReadCount 0,
      # instead of more slowly letting PowerShell stream the lines 
      # (emit them one by one) and then collect them in an array for you.
      # The -replace operator then acts on each element of the array.
      (Get-Content -ReadCount 0 file.txt) -replace ',$'
      

    注: @(...) 在这种情况下是必要的,因为 -读取计数0

    A. 性能更好的逐行处理替代方案 -虽然它不能直接用作 -就是使用 -switch statement -File 参数 -请参见 this answer


    [1] 此元数据以以下形式提供: ETS (Extended Type System) 呼叫 | Format-List -Force 查看这些属性。虽然这些额外信息可能会有所帮助,但附加这些信息对性能的影响是显而易见的。鉴于信息通常 选择退出 GitHub issue #7537 .