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

问题描述 投票:0回答:1

当我在Notepad++中处理一个数据类型的文本列表时,我想把每行的属性值都改为 "无 "字,方法是把它们选入列选中,效果很好。

但是问题来了... 现在我在列表中完成了我想做的事情,我现在想把真正的id值与数字放在一起,可以替换所有的 "none "字,但是要用特定的方式。我正在做的那个列表实际上有近5千行,其中有2千行,包括多行重复的行。

由于这个原因,我必须承认,如果我决定手动操作的话,我将会有一个非常困难的时间,因为这个事情的痛苦性和长时间的工作......。也许有点棘手的解释,所以这里的例子。

<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++软件中搜索,但不幸的是,我没有找到任何允许它的选项,尽管我很确定它可以用regex命令或(也许?)一个插件扩展来做。如果有比我更了解的人可以帮助我,这将是巨大的(请)。

search text replace duplicates notepad++
1个回答
1
投票

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


但是,如果你真的想使用Notepad++,而且如果id的数量不是太多(因为会变得不可读),你可以做如下操作。

  • 按Ctrl键+H
  • 找到什么。<obj name="wall\.(?:(ZOL)|(XYZ)|(DOR)|(BUL))" id="\Knone
  • 替换为: (?{1}4130:(?{2}5340:(?{3}1700:(?{4}9500))))
  • CHECK 匹配案例
  • 检查 围绕
  • 检查 正则表达式
  • 替换所有

解释:

<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

截图(前)。

enter image description here

截图(后)。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.