【问题标题】:Regex replace contents of file and delete lines that don't match正则表达式替换文件内容并删除不匹配的行
【发布时间】:2015-06-30 10:37:57
【问题描述】:

我有一个大型日志文件,我想在其中提取某些类型的行。我创建了一个工作正则表达式来匹配这些行。我现在如何使用这个正则表达式来提取线条而不是别的?我试过了

cat .\file | %{ 
    if($_ -match "..."){
        $_ -replace "...", '...'
    }
    else{

        $_ -replace ".*", ""
    }
}

这几乎可以工作,但不感兴趣的行仍然保持为空白行(意味着感兴趣的行间隔非常远)。

【问题讨论】:

    标签: regex powershell replace


    【解决方案1】:

    只是附加到briantist's answer 你甚至不需要循环结构。 -match-replace 将用作数组运算符。不再需要ifForEach-Object

    (Get-Content .\file) -match "..." -replace "...","..."
    

    Get-Content 是别名cat 的目标

    【讨论】:

    • 非常好,+1! @David Grinberg,Powershell 有很多这样的东西,它们真的派上用场了。请注意,其中一些是在 Powershell 3 中添加的(例如在包含 Thing 属性的对象数组上使用 .Thing 以返回事物数组),因此还要注意您正在编写的版本。
    【解决方案2】:

    最好的方法是完全删除else 子句。如果您这样做,则不会从 ForEach-Object 块的迭代中返回任何对象。

    cat .\file | %{ 
        if($_ -match "..."){
            $_ -replace "...", '...'
        }
    }
    

    【讨论】:

    • 正则表达式不是每行运行一次吗?如果我添加一个s 标志,我认为这不会有帮助吗?无论哪种方式,我都更喜欢不修改正则表达式的解决方案
    • 而这次我真的测试过了!
    • 哦,我明白了。如果我不输出任何内容,它就不会进入下一个管道 - 所以如果我不输出空行,我将不会得到空行。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 2022-08-19
    • 2022-07-08
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多