更换特定零件

Replacing a specific part

我有一个这样的列表:

DEL075MD1BWP30P140LVT
AN2D4BWP30P140LVT
INVD0P7BWP40P140
IND2D6BWP30P140LVT

我想用 *

替换 DBWP 之间的所有内容

如何在 unixtcl

中做到这一点
  • 您是同时提供整个列表,还是一次从某个地方获取一项?
  • 应该处理所有 D-BWP 组,还是每个项目只处理一个?
  • 如果每个项目只有一个,应该是第一个还是最后一个(这是最简单的选择)?

Tcl RE 没有任何回顾,这在此处会很好。但是,如果您捕获球门柱并将它们作为后向参考粘贴到替换中,则可以不使用后视和前视。球门柱之间文本的正则表达式应为 [^DB]+,即不包含 DB 的任何文本中的一个或多个(以确保匹配不会转义球门柱并坚持文本中的其他 D 或 B)。所以:{(D)[^DB]+(BWP)}(RE 周围的大括号通常是个好主意)。

如果您有整个列表并想处理所有组,试试这个:

set result [regsub -all {(D)[^DB]+(BWP)} $lines {*}]

(如果你一次只能处理一行,基本上是一样的,你只是为一行使用一个变量,而不是为整个列表使用一个变量。在下面的例子中,我使用 lmap 来生成单独的行,这意味着无论如何我都需要拥有整个列表;这只是一个例子。)

只处理每一行中的第一组:

set result [lmap line $lines {
    regsub {(D)[^DB]+(BWP)} $line {*}
}]

仅处理每一行中的最后一组:

set result [lmap line $lines {
    regsub {(D)[^DB]+(BWP[^D]*)$} $line {*}
}]

{(D)[^DB]+(BWP[^D]*)$} RE 扩展了右球门柱以确保在球门柱和球门线末端之间的任何地方都没有 D(因此可能是一个新组)。

文档: lmap (for Tcl 8.5), lmap, regsub, set, Syntax of Tcl regular expressions