我有一个这样的列表:
DEL075MD 1 BWP30P140LVT
AN2D 4 BWP30P140LVT
INVD 0P7 BWP40P140
IND2D 6 BWP30P140LVT
我想D
用BWP
一个*
我怎样才能做到这unix
一点tcl
我有一个这样的列表:
DEL075MD 1 BWP30P140LVT
AN2D 4 BWP30P140LVT
INVD 0P7 BWP40P140
IND2D 6 BWP30P140LVT
我想D
用BWP
一个*
我怎样才能做到这unix
一点tcl
Tcl REs 没有任何后视功能,这在这里会很好。但是,如果您捕获球门柱并将它们作为反向引用粘贴到替换中,则可以不使用后向和前瞻。球门柱之间的文本的正则表达式应该是[^DB]+
,即一个或多个不包含D
or的任何文本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 正则表达式