在lua中用正则表达式替换字符串

时间:2018-03-26 18:59:39

标签: replace lua lua-patterns

我有很多日志文件,每个文件包含1000多行。 文件的一部分如下:

ldply(split(x, cumsum(x == "Home")), rbind)[-1]

我想替换" + 3.282704E + 00" (第8行)有另一个值。重要的是要知道,每个标签都像" {@ BLOCK | 1%x1101_swp | 00"是唯一的,但此标记的行号对于不同的文件可能不同。 如何在Lua中实现这一点?我试着在两行之间使用正则表达式,在" @ BLOCK"和#34; {@ LIM2"但没有结果。 为:

{@BLOCK|1%r1331|00
{@A-JUM|0|-9.352000E+06{@LIM2|+9.999999E+99|+1.000000E+04}}
}
{@BLOCK|1%x1001_swp|00
{@A-JUM|0|+3.362121E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x1101_swp|00
{@A-JUM|0|+3.282704E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x201_swp|00
{@A-JUM|0|+3.276452E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x202_swp|00
{@A-JUM|0|+3.216571E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}

我试过:

 {@BLOCK|1%x1101_swp|00
 {@A-JUM|0|+3.282704E+00{@LIM2|+2.000000E+01|+0.000000E+00}}

2 个答案:

答案 0 :(得分:1)

您可以使用

local res = line:gsub("(%{@BLOCK%|1%%x201_swp%|00\r?\n%{@A%-JUM%|0%|).-(%{@LIM2%|)", "%1".. ff[$lines] .."%2")

请参阅Lua demo

<强>详情

  • (%{@BLOCK%|1%%x201_swp%|00\r?\n%{@A%-JUM%|0%|) - 第1组:{@BLOCK|1%x201_swp|00子字符串,后跟可选的CR符号,然后是LF,然后是{@A-JUM|0|
  • .- - 任意0个字符,尽可能少
  • (%{@LIM2%|) - 第2组:{@LIM2| substring。

%1%2占位符分别指代替换模式中存储在第1组和第2组中的值。

答案 1 :(得分:0)

您可以使用这种更统一的方式:

local line = [[{@BLOCK|1%r1331|00
{@A-JUM|0|-9.352000E+06{@LIM2|+9.999999E+99|+1.000000E+04}}
}
{@BLOCK|1%x1001_swp|00
{@A-JUM|0|+3.362121E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x1101_swp|00
{@A-JUM|0|+3.282704E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x201_swp|00
{@A-JUM|0|+3.276452E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}
{@BLOCK|1%x202_swp|00
{@A-JUM|0|+3.216571E+00{@LIM2|+2.000000E+01|+0.000000E+00}}
}]]

local function Replace(line, unic_block, unic_num, to_num)
    unic_block = unic_block:gsub("%%","%%%%") -- escaping magic symbol '%'
    unic_num = unic_num:gsub("[%+%.]",function(c) return "%"..c end)  -- escaping magic symbols '+' and '.'
    return line:gsub("(" ..unic_block .. ".-%c+.-)" .. unic_num, "%1" .. to_num ) 
end
local xline = Replace(line, "{@BLOCK|1%x1101_swp|00", "+3.282704E+00", "9999999")

print (xline)