【问题标题】:What's the best way to perform very large regex operations?执行非常大的正则表达式操作的最佳方法是什么?
【发布时间】:2019-07-23 17:31:48
【问题描述】:

我有一个超过 200 万行的文本文件,我正在尝试删除所有换行符,将所有文本放在一行中。

我同时删除了所有多余的空白字符。

尝试 #1:我尝试使用 Visual Studio 2017,它只会在工作负载上阻塞和崩溃。
Find and replace "\s+" with " "

尝试 #2: 我尝试使用 PowerShell,它成功完成,并将所有连续的空白字符组合成一个空格字符,但由于某种原因没有删除任何换行符。
(Get-Content -path "Input.txt") -replace "\n", " " -replace "\r", " " -replace "\s+", " " | Out-File "Output.txt"

显然 Visual Studio 是不可能的,因为它无法处理这项工作。

但是为什么 PowerShell 会正确删除多余的空格,而不是换行符?
我做错了什么吗?

或者有没有更好的工具来完成这项工作?

【问题讨论】:

  • 如果您使用Get-Content,则默认返回一个数组,其中每一行都是数组中的索引元素。如果您想以这种方式替换换行符,您需要使用Get-Content -Raw,它将按原样输出文本。另一种方法是将数组元素与(Get-Content Input.txt) -join " " 之类的空格连接起来。

标签: regex powershell command-line


【解决方案1】:

对于许多基于行的工具来说,您请求的任务实际上非常困难,因为它们希望在发出之前将输出行打包到内存中。您要求他们将整个文件打包成 1 行,这对于大文件是不切实际的。

如您所见,有些工具甚至根本不考虑替换换行符,因此它们将这种风险降至最低。

一个技巧是指定一个选项来告诉该工具使用另一个字符作为换行符或记录分隔符,您不想更改的内容经常发生,因此“行”不会太大。太空可能是一个不错的选择。

使用sedawk 这相对容易,而且我相信很快就会有人为您提供准确的命令行:-)。

【讨论】:

    【解决方案2】:

    似乎最好(和性能最好)的解决方案是按照 cmets 中的建议添加 -raw
    该命令在几秒钟内执行,而不是几分钟。

    (Get-Content -raw -path "Input.txt") -replace "\s+", " " | Out-File "Output.txt"
    

    【讨论】:

      【解决方案3】:

      这应该可行。我一次只做一行。并在每行'$'的末尾添加一个空格。

      Get-Content Input.txt | foreach { $_ -replace '\s+',' ' -replace '$',' ' } | 
        set-content -nonewline Output.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多