pcregrep:如何只匹配第一次出现?

时间:2019-09-05 17:32:34

标签: regex pcregrep

我有很多文件,格式如下:

SIMPLE
{
    residualControl
    {
        p               1e-4;
        U               1e-4;
        "(k|omega|epsilon)" 1e-4;
    }
    nNonOrthogonalCorrectors 0;
    pRefCell        0;
    pRefValue       0;

}

potentialFlow
{
    nNonOrthogonalCorrectors 10;
}

relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        "(k|omega|epsilon).*" 0.7;
    }
}

我要匹配文件夹$FOAM_TUTORIALS/incompressible中所有文件中的以下文本块:

    residualControl
    {
       // line 1
       // line 2
       // ...etc
    }

当我如下使用pcregrep时:

    pcregrep --color -r -M "residualControl.*\n.*\{(.*\n)*" $FOAM_TUTORIALS/incompressible/

它也与其他行匹配(请参见下面的注释):

SIMPLE
{
    residualControl
    {
        p               1e-4;
        U               1e-4;
        "(k|omega|epsilon)" 1e-4;
    } // <<<<<<<<<<<<<<<<<<<<<<<<<<< I want it to stop match here. But it matches also the lines below
    nNonOrthogonalCorrectors 0;
    pRefCell        0;
    pRefValue       0;

}

potentialFlow
{
    nNonOrthogonalCorrectors 10;
}

relaxationFactors
{
    fields
    {
        p               0.3;
    }
    equations
    {
        U               0.7;
        "(k|omega|epsilon).*" 0.7;
    }
}

能否请您告诉我如何修改正则表达式以仅匹配第一个块?

1 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式进行搜索:

pcregrep --color -r -M '^\h*residualControl\s*{[^}]*}' $FOAM_TUTORIALS/incompressible/

residualControl
{
    p               1e-4;
    U               1e-4;
    "(k|omega|epsilon)" 1e-4;
}

RegEx详细信息:

  • ^\h*:在一行开始处匹配0个或多个水平空白
  • residualControl\s*:匹配字符串residualControl,后跟0个或多个空格(包括换行符)
  • {:比赛开始{
  • [^}]*:匹配0个或多个非}的字符(包括换行符)
  • }:比赛闭幕}