首页 > 解决方案 > Notepad ++中有没有办法使用查找和替换来查找文本,然后替换后面几行的文本?

问题描述

我目前正在尝试通过一个文本文件工作,我需要在其中找到一个特定的文本字符串,然后替换该文本字符串之后几行的文本行。下面是一个文本示例:

<MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Conveyor">
     <SubtypeName>LargeBlockConveyor</SubtypeName>
     <EntityId>111664082437655291</EntityId>
     <Min x="9" y="30" z="7" />
     <BlockOrientation Forward="Right" Up="Up" />
     <ColorMaskHSV x="0" y="-0.8" z="0.2" />
</MyObjectBuilder_CubeBlock>

在这种情况下,我需要搜索字符串MyObjectBuilder_Conveyor,然后我需要实际编辑字符串ColorMaskHSV x="0" y="-0.8" z="0.2"

期望的结果是每个实例中的所有内容都MyObjectBuilder_Conveyor将保持不变,唯一的变化是对ColorMAskHSV行。

在这种特定情况下,一切都将保持不变,但z="0.2"将更改为z="-0.15". 不幸的是,还有许多其他变体MyObjectBuilder_,所有这些都需要保持不变,所以我不能只做一个查找/替换z="0.2"

中间的行是唯一的,因此它们不能被批量替换,并且文件中有超过 1000 个这样的条目,因此至少可以说手动编辑它们会很耗时。

有没有办法创建一个查找和替换表达式,或者可能是 Notepad++ 中的其他工具,可以简化这种事情?

标签: replacefindnotepad++

解决方案


  • Ctrl+H
  • 找什么:<MyObjectBuilder_CubeBlock(?:(?!</MyObjectBuilder_CubeBlock>).)+<ColorMaskHSV .+?z="\K[^"]+
  • 用。。。来代替:-0.15
  • 检查 火柴盒
  • 检查 环绕
  • CHECK 正则表达式
  • 查看 . matches newline
  • Replace all

解释:

<MyObjectBuilder_CubeBlock          # literally, open tag
                            # Tempered greedy token
(?:                                 # non capture group
  (?!                               # negative lookahead, make sure we haven't after:
    </MyObjectBuilder_CubeBlock>        #  close tag
  )                                 # end lookahead
  .                                 # any character
)+                                  # end group, must appear 1 or more times
<ColorMaskHSV .+?                   # literally, open tag, followed by 1 or more any character, not greedy
z="                                 # literally
\K                                  # forget all we have seen until this position
[^"]+                               # 1 or more any character that is not double quote (i.e. the value to change)

截图(之前):

在此处输入图像描述

截图(之后):

在此处输入图像描述


推荐阅读