如何用这些相同的行集替换所有重复的行集但修改 - 一次全部?

How to replace all sets of duplicated lines with these same sets of lines but modified - all at once?

在 Notepad++ 中处理数据类型的文本列表时,我想通过将属性值选择到列选择中来将每行中的属性值更改为 "none" 字,效果很好。

但是问题来了...现在我完成了我想在列表中做的事情,我现在想把真实的 id 值和可以替换所有 "none" 单词的数字放在一起,但是在具体方式。 我正在使用的那个列表实际上接近 5k 行以及大约 2k 行,其中包括多组重复行。

出于这个原因,我必须承认,如果我决定手动进行操作,我会遇到非常困难的事情,因为这件事需要很长时间才能完成……解释起来可能有点棘手这里的例子:

<obj name="wall.ZOL" id="none"
<obj name="wall.ZOL" id="none"
<obj name="wall.ZOL" id="none"
<obj name="wall.XYZ" id="none"
<obj name="wall.XYZ" id="none"
<obj name="wall.XYZ" id="none"          <------------- In my actual document
<obj name="wall.DOR" id="none"
<obj name="wall.DOR" id="none"
<obj name="wall.DOR" id="none"
<obj name="wall.BUL" id="none"
<obj name="wall.BUL" id="none"
<obj name="wall.BUL" id="none"

在上面的示例中,如您所见,有 12 行,但它仅包含 4 种不同类型的数据,因为只是名称更改,所以可以说这 4 种类型的数据只是 4 组重复行。这里是第二个例子:

<obj name="wall.ZOL" id="4130"
<obj name="wall.ZOL" id="4130"
<obj name="wall.ZOL" id="4130"
<obj name="wall.XYZ" id="5340"
<obj name="wall.XYZ" id="5340"
<obj name="wall.XYZ" id="5340"          <------------- How I would like it to be
<obj name="wall.DOR" id="1700"
<obj name="wall.DOR" id="1700"
<obj name="wall.DOR" id="1700"
<obj name="wall.BUL" id="9500"
<obj name="wall.BUL" id="9500"
<obj name="wall.BUL" id="9500"

并且在上面的这一秒中,有完全相同的文本,但只有 id 发生了变化。正如您所看到的,数字代替了 "none" 单词,同时尊重 id 只有在行中的 name="[name]" 发生变化时才会发生变化。

所以这是我真正能够做的,例如当按下 CTRL+H 时;

            WHILE SEARCHING FOR...        

        <obj name="wall.ZOL" id="none"
        <obj name="wall.XYZ" id="none"
        <obj name="wall.DOR" id="none"
        <obj name="wall.BUL" id="none"

       ...AND THEN "REPLACE BY" THIS...

        <obj name="wall.ZOL" id="4130"
        <obj name="wall.XYZ" id="5340"
        <obj name="wall.DOR" id="1700"
        <obj name="wall.BUL" id="9500"

 ...TO GET THE RESULT IN MY DOCUMENT LIKE THAT:

        <obj name="wall.ZOL" id="4130"
        <obj name="wall.ZOL" id="4130"
        <obj name="wall.ZOL" id="4130"
        <obj name="wall.XYZ" id="5340"
        <obj name="wall.XYZ" id="5340"
        <obj name="wall.XYZ" id="5340"
        <obj name="wall.DOR" id="1700"
        <obj name="wall.DOR" id="1700"
        <obj name="wall.DOR" id="1700"
        <obj name="wall.BUL" id="9500"
        <obj name="wall.BUL" id="9500"
        <obj name="wall.BUL" id="9500"

这就是我想要做的。即使我发现了类似这个问题的案例,我也没有找到任何线程可以帮助我对完全相同类型的文本执行完全相同的事情,因为我知道我有超过一千行要处理。

我也尝试在制作精美的 Notepad++ 软件中进行搜索,但不幸的是,我没有找到任何允许它的选项,尽管我很确定它可以使用正则表达式命令或(也许?)插件扩展来做到这一点。如果比我更了解的人可以提供帮助,那就太好了(请)。

你最好用你喜欢的脚本语言写一个脚本。


但是,如果你真的想使用Notepad++并且id的数量不是太多(因为会变得不可读),你可以这样做:

  • Ctrl+H
  • 查找内容:<obj name="wall\.(?:(ZOL)|(XYZ)|(DOR)|(BUL))" id="\Knone
  • 替换为:(?{1}4130:(?{2}5340:(?{3}1700:(?{4}9500))))
  • 检查 匹配大小写
  • 检查 环绕
  • 检查 正则表达式
  • 全部替换

解释:

<obj name="wall\.   # literally
(?:                 # non capture group
    (ZOL)               # group 1
  |                   # OR
    (XYZ)               # group 2
  |                   # OR
    (DOR)               # group 3
  |                   # OR
    (BUL)               # group 4
# you can add more groups if you need them.
)                   # end group
" id="              # literally
\K                  # forget all we have seen until this position
none                # literally

替换:

(?{1}               # if group 1 exists (i.e. "ZOL")
  4130                # id value for "ZOL"
 :                  # else
  (?{2}               # if group 2 exists
    5340                # value for "XYZ"
   :                  # else
    (?{3}               # if group 3  exists
      1700                # value for "DOR"
     :                  # else
      (?{4}9500)          # if group 4 exists, value for "BUL"
    )                   # endif
  )                   # endif
)                   # endif

截图(之前):

截图(后):