Linux 中的多行搜索和替换

Linux 中的多行搜索和替换

已尝试使用 vim,但愿意接受其他想法/建议。

想要在一个有 12000 行的文件中执行搜索和替换。

具体来说,如果在“^Hide”定义之后和下一个“^Hide”或“^Show”之前出现“^ SetFontSize 28”,则将 28 更改为 18。示例如下。

这是原始文件的片段。

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    LinkedSockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 28

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    Sockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 28

Show # Gear - Endgame
    ItemLevel >= 83
    Rarity = Normal
    Sockets < 3
    BaseType "Tiger Hook"
    SetTextColor 240 240 240 # Normal Item Highlight
    SetBackgroundColor 70 70 70
    SetFontSize 28

第一个“隐藏”块的最终结果如下所示:

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    LinkedSockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 18

将 SetFontSize 28 替换为 SetFontSize 18,但前提是它出现在“^Hide”块中。

我在 vim 中尝试过的令人讨厌的正则表达式: :%s/^Hide\(.*\)SetFontSize 28$/Hide\1SetFontSize 18/g

但被告知未找到模式。如果需要任何其他信息或我的请求不清楚,请告诉我。

答案1

仅需更正两点:

  • 在 Vim 的正则表达式中,.不包括换行符。可能还有其他更好的方法,但我通常只(.|[\n])在需要时才这么做。
  • *是贪婪的,但是你想在这里进行非贪婪匹配。{-}就可以了。

还有一件事,这是我的个人偏好,所以请根据其价值来判断:我很难记住 Vim 的正则表达式中什么是魔法字符,什么不是;所以我最终只是\v在模式的开头使用,这样除了'0'-'9''a'-'z''A'-'Z'之外的所有 ASCII 字符'_'都有特殊含义。

总而言之:

%s/\v^Hide((.|[\n]){-})SetFontSize 28/Hide\1SetFontSize 18/g

相关内容