正则表达式查找后续行不包含特定字符串的代码行

问题描述 投票:0回答:1

我是正则表达式的新手,尝试自己解决问题几个小时,现在我不得不投降。我希望我的问题能够解决,并且这里的专家能为我提供解决方案。我有一个大约 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”,(然后将在单独的步骤中翻译英文文本)

我希望大家清楚我正在尝试做什么(抱歉文字太长!)。有人可以帮忙吗?预先感谢,乌鸦。

regex search filter replace kate
1个回答
0
投票

使用 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
不变。

进行任何必要的更改。

最后,将

!!!!
替换为空字符串。

我希望在其他程序员的编辑器中能够实现非常相似的功能。

© www.soinside.com 2019 - 2024. All rights reserved.