替换特定部件

时间:2017-02-08 06:05:05

标签: unix replace tcl str-replace regsub

我有一个这样的清单:

  

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

我想用D

替换BWP*之间的所有内容

我如何在unixtcl

中执行此操作

1 个答案:

答案 0 :(得分:3)

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

Tcl REs没有任何外观,这在这里本来不错。但是,如果您捕获球门柱并将其作为后退引用粘贴到替换中,则可以不使用后观和前瞻。球门柱之间文本的正则表达式应为[^DB]+,即一个或多个不包含DB的文本(以确保匹配不会逃脱球门柱并坚持文中的其他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)lmapregsubsetSyntax of Tcl regular expressions