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)
屏幕截图(之前):
截图(后):
我目前正在尝试处理一个文本文件,我需要在其中找到一个特定的文本字符串,然后替换该文本字符串后几行的文本行。以下是文本示例:
<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++ 中的其他一些工具可以简化此类操作?
- 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)
屏幕截图(之前):
截图(后):