我有很多日志文件,每个文件包含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}}
答案 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)