我是正则表达式的新手,尝试自己解决问题几个小时,现在我不得不投降。我希望我的问题能够解决,并且这里的专家能为我提供解决方案。我有一个大约 400k 行的文本文件(PLC 软件的导出代码),我尝试在其中查找特定行以便能够添加缺失的代码行。代码中的一些描述文本是多语言的,并且每种语言都有一个标识符,以便最终显示正确的语言。例如desc001 (=英语) desc049 (=德语) 等等。问题是,许多代码行都丢失了。目标是搜索任何带有 desc001 且没有直接跟随在带有 desc049 的行之后的行。因为我从基于 Linux 的软件中获取代码,所以我尝试在 KATE 中进行操作。
我的代码如下所示:
\P/GPAG\I\AT/RP/FI044007aH1 (
deleted = False ,
)
\P/GPAG\I\AT/RP/FI044007aH1\active (
desc001 = "13 Max allowed value extraction FT044007" ,
desc049 = "13 Erlaubter Höchstwert Extraktion FT044007" ,
dflt = "200" ,
max = "300" ,
min = "100" ,
type = "REAL" ,
unit = "kg/h" ,
)
\P/GPAG\I\AT/RP/FI044007aL1 (
deleted = False ,
)
\P/GPAG\I\AT/RP/FI044007aL1\active (
desc001 = "12 Min allowed value extraction FT044007" ,
dflt = "100" ,
max = "200" ,
min = "0" ,
type = "REAL" ,
unit = "kg/h" ,
)
\P/GPAG\I\AT/RP/FT044007 (
deleted = False ,
)
\P/GPAG\I\AT/RP/FT044007\active (
desc001 = "11 CO2 flow" ,
desc049 = "11 CO2 Durchfluss" ,
dflt = "150" ,
max = "200" ,
min = "100" ,
type = "REAL" ,
unit = "kg/h" ,
)
\P/GPAG\I\AT/RP/I130001aH1 (
deleted = False ,
)
\P/GPAG\I\AT/RP/I130001aH1\active (
desc001 = "07 Max allowed value extraction TT130001" ,
desc049 = "07 Erlaubter Höchstwert Extraktion TT130001" ,
dflt = "40" ,
max = "100" ,
min = "0" ,
type = "REAL" ,
unit = "°C" ,
)
\P/GPAG\PD/Software/Logic/Sensors/Press/PT022005 (
active = \P/GPAG\PD/Software/Logic/Sensors/Press/PT022005\V0.0.15 ,
active_time = 23.04.2024 11:44:34.750 ,
active_user = "Max" ,
active_user_full = "" ,
ccloc_used_ref = \P/GPAG\I\HW/GPAGrun ,
cctaskref = "Press" ,
cfc_simple = "CTRL" ,
class = "FP" ,
ctime = 22.09.2014 14:36:42.726 ,
current = \P/GPAG\PD/Software/Logic/Sensors/Press/PT022005\V0.0.15 ,
desc001 = "Pressure @ Work-Tank Top" ,
ext_imported = \OT\F\EXT_IMPORTED ,
imported_time = (Vt_NOW) 23.04.2024 14:05:18.000 ,
imported_user = "John" ,
imported_user_full = "John, Doe" ,
instance = "PT022005" ,
instref = \P/GPAG\I\FP/PT022005 ,
loc_used_ref = \P/GPAG\I\HW/Ctrl01 ,
mtime = 23.04.2024 11:44:34.753 ,
muser = "MM" ,
muser_full = "Max, Mustermann" ,
otref = \OT\P\FP ,
taskref = "TskPress" ,
tb_structure = "R 4.2-06" ,
user = "MM" ,
user_full = "Max, Mustermann" ,
)
在示例代码中,第二个和最后一个块确实缺少德语翻译。我知道如何查找和选择所有英文文本 (.(desc001 = "(.?),).) 并且我已经弄清楚如何查找不包含德语文本的所有内容 ^((?!desc049 ).)$ 但我无法将它们组合起来,因此我只能找到没有德语翻译的英文文本。最终,我想搜索
。desc001 =“12 最小允许值提取 FT044007”,(来自 2. 块)
并将其替换为自身加上重复项,其中 001 更改为 049。结果应该是
desc001 = "12 最小允许值提取 FT044007" , desc049 =“12 最小允许值提取 FT044007”,(然后将在单独的步骤中翻译英文文本)
我希望大家清楚我正在尝试做什么(抱歉文字太长!)。有人可以帮忙吗?预先感谢,乌鸦。
使用 Notepad++ 等编辑器,您可以搜索成对的
desc001
后跟 desc049
,并将它们替换为 desc!!!!001
后跟 desc!!!!049
(假设 !!!!
从未出现在文件中,或者使用其他一些非出现的文本)。那么所有剩余的 desc001
行后面都没有 desc049
。根据需要添加或编辑文件。最后,将!!!!
整个移除。
更详细。
将
^(\h+desc)(001\h*=.*\R\h+desc)(049\h*=)
替换为 \1!!!!\2!!!!\3
。
以上转换:
\P/GPAG\I\AT/RP/I130001aH1\active (
desc001 = "07 Max allowed value extraction TT130001" ,
desc049 = "07 Erlaubter Höchstwert Extraktion TT130001" ,
dflt = "40" ,
current = \P/GPAG\PD/Software/Logic/Sensors/Press/PT022005\V0.0.15 ,
desc001 = "Pressure @ Work-Tank Top" ,
ext_imported = \OT\F\EXT_IMPORTED ,
到
\P/GPAG\I\AT/RP/I130001aH1\active (
desc!!!!001 = "07 Max allowed value extraction TT130001" ,
desc!!!!049 = "07 Erlaubter Höchstwert Extraktion TT130001" ,
dflt = "40" ,
current = \P/GPAG\PD/Software/Logic/Sensors/Press/PT022005\V0.0.15 ,
desc001 = "Pressure @ Work-Tank Top" ,
ext_imported = \OT\F\EXT_IMPORTED ,
留下孤独
desc001
不变。
进行任何必要的更改。
最后,将
!!!!
替换为空字符串。
我希望在其他程序员的编辑器中能够实现非常相似的功能。