我有一个这样的清单:
DEL075MD的 1 BWP30P140LVT
AN2D的 4 BWP30P140LVT
INVD的 0P7 BWP40P140
IND2D的 6 BWP30P140LVT
我想用D
BWP
和*
之间的所有内容
我如何在unix
和tcl
答案 0 :(得分:3)
Tcl REs没有任何外观,这在这里本来不错。但是,如果您捕获球门柱并将其作为后退引用粘贴到替换中,则可以不使用后观和前瞻。球门柱之间文本的正则表达式应为[^DB]+
,即一个或多个不包含D
或B
的文本(以确保匹配不会逃脱球门柱并坚持文中的其他D或B)。所以:{(D)[^DB]+(BWP)}
(RE周围的大括号通常是个好主意)。
如果您拥有整个列表并希望处理所有组,请尝试以下操作:
set result [regsub -all {(D)[^DB]+(BWP)} $lines {\1*\2}]
(如果你一次只能处理一行,它基本上是相同的,你只需要为一行使用一个变量而不是整个列表的变量。在下面的例子中,我使用{{1}生成单独的行,这意味着无论如何我需要拥有整个列表;这只是一个例子。)
只处理每一行中的第一组:
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]*)$}
(因而可能是新组)。
文档: lmap (for Tcl 8.5), lmap, regsub, set, Syntax of Tcl regular expressions