В Notepad ++ есть способ использовать поиск и замену, чтобы найти текст, а затем заменить текст, который идет через несколько строк после него? - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время я пытаюсь пройтись по текстовому файлу, где мне нужно найти указанную текстовую строку c, а затем заменить строку текста, которая идет через несколько строк после этой текстовой строки. Вот пример текста:

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

В этом конкретном c случае все останется прежним, но z="0.2" будет изменено на z="-0.15". К сожалению, есть также много других вариантов MyObjectBuilder_, все из которых должны остаться неизменными, поэтому я не могу просто найти / заменить z="0.2"

Промежуточные строки уникальны, поэтому они Пакетная замена не может быть выполнена, и в этом файле содержится более 1000 таких записей, поэтому их редактирование вручную, по меньшей мере, отнимает много времени.

Есть ли способ создать выражение поиска и замены или, возможно, какой-нибудь другой инструмент в Notepad ++, который позволил бы оптимизировать подобные вещи?

1 Ответ

0 голосов
/ 20 апреля 2020
  • Ctrl + H
  • Найти что: <MyObjectBuilder_CubeBlock(?:(?!</MyObjectBuilder_CubeBlock>).)+<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)

Снимок экрана (до):

enter image description here

Снимок экрана (после):

enter image description here

...