【问题标题】:Is there a way in Notepad++ to use find and replace to find text and then replace text that comes several lines after it?Notepad ++中有没有办法使用查找和替换来查找文本,然后替换后面几行的文本?
【发布时间】:2020-08-03 00:50:34
【问题描述】:

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

<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++ 中的其他工具,可以简化这种事情?

【问题讨论】:

  • 您的预期结果是什么?
  • 期望的结果是列出的文本中的所有内容(“MyObjectBuilder_Conveyor”的每个实例的所有唯一文本/值)都将保持不变,唯一的变化是 ColorMAskHSV 行。在这种特定情况下,一切都将保持不变,但 z="0.2" 将更改为 z="-0.15"。不幸的是,“MyObjectBuilder_”还有许多其他变体,所有这些都需要保持不变,所以我不能只对“z="0.2"”进行查找/替换。

标签: replace find notepad++


【解决方案1】:
  • Ctrl+H
  • 查找内容:&lt;MyObjectBuilder_CubeBlock(?:(?!&lt;/MyObjectBuilder_CubeBlock&gt;).)+&lt;ColorMaskHSV .+?z="\K[^"]+
  • 替换为:-0.15
  • 检查 匹配大小写
  • 检查 环绕
  • CHECK 正则表达式
  • 检查 . 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)

屏幕截图(之前):

截图(之后):

【讨论】:

  • 这可以找到 MyObjectBuilder_CubeBlock 的每个实例,然后更改“z=”的值。不幸的是,我只需要选择该行后半部分为 MyObjectBuilder_Conveyor 的那些实例。我尝试简单地将 MyObjectBuilder_Conveyor 替换为 MyObjectBuilder_CubeBlock,但表达式没有按预期工作,并在文件中引入了错误。 的所有实例,只有以“MyObjectBuilder_Conveyor”结尾的实例,才能修改“z=”值。
  • 为了澄清,大约有 7000 个 MyObjectBuilder_CubeBlock 实例,但我需要使用此表达式仅选择 MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Conveyor" 实例,其中大约有 1000 个。跨度>
  • @SpacedInvader:只需在Find what 框中将&lt;MyObjectBuilder_CubeBlock 更改为&lt;MyObjectBuilder_CubeBlock xsi:type="MyObjectBuilder_Conveyor"&gt;
  • 好的,这确实让它正常工作。非常感谢您的帮助!
猜你喜欢
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2013-08-14
  • 1970-01-01
  • 2011-08-20
  • 2011-11-24
相关资源
最近更新 更多