已尝试使用 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