1

我有一个这样的列表:

DEL075MD 1 BWP30P140LVT
AN2D 4 BWP30P140LVT
INVD 0P7 BWP40P140
IND2D 6 BWP30P140LVT

我想DBWP一个*

我怎样才能做到这unix一点tcl

4

1 回答 1

3
  • 您是否同时拥有整个列表,或者您是从某个地方一次获得一个项目?
  • 应该处理所有 D-BWP 组,还是每个项目只处理一个?
  • 如果每个项目只有一个,它应该是第一个还是最后一个(这些是最简单的选择)?

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

如果您拥有整个列表并想要处理所有组,请尝试以下操作:

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

(如果您一次只能使用一行,则基本相同,您只需对单行使用变量而不是对整个列表使用变量。在以下示例中,我使用lmap生成单独的行,这意味着无论如何,我需要有整个列表;这只是一个例子。)

仅处理每行中的第一组:

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

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

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

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

文档: lmap (for Tcl 8.5) , lmap , regsub , set , Syntax of Tcl 正则表达式

于 2017-02-08T11:02:45.363 回答