Notepad++ 中有没有一种方法可以使用查找和替换来查找文本,然后替换它后面几行的文本?

Is there a way in Notepad++ to use find and replace to find text and then replace text that comes several lines after it?

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

<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"

做一个 find/replace

中间的行是唯一的,因此无法批量替换,而且文件中有1000多个这样的条目,因此手动编辑它们至少可以说是耗时的。

有没有一种方法可以创建查找和替换表达式,或者可能是 Notepad++ 中的其他一些工具可以简化此类操作?

  • Ctrl+H
  • 查找内容:<MyObjectBuilder_CubeBlock(?:(?!</MyObjectBuilder_CubeBlock>).)+<ColorMaskHSV .+?z="\K[^"]+
  • 替换为:-0.15
  • 检查 匹配大小写
  • 检查 环绕
  • 检查 正则表达式
  • 检查 . matches newline
  • 全部替换

解释:

<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)

屏幕截图(之前):

截图(后):