以下是我的真实场景:
我的输出如下:
邻居组:测试
服务器地址 - 10.0.0.1邻居组:测试日期 :Jul 08 18:26:32 2014 Queries Pending:0/1
请求方法:循环服务器地址 - 20.0.0.1邻居 组:测试日期:2014年7月8日18:26:32 查询待处理:0/1请求方法:循环服务器地址 - 30.0.0.1邻居组:测试日期 :Jul 08 18:26:32 2014 Queries Pending:0/1
请求方法:循环法
从以上所有输出中我想将输出分组到TCL列表中,
我希望从(起始分隔符)中捕获Server Address
在给定字符串中开始到word before
,下次Server Address
到来。
因此,对于第一台服务器,regexp输出应该是:
{服务器地址 - 10.0.0.1邻居组:测试
日期:Jul 08 18:26:32查询待审:
0/1请求方法:循环}
因此,对于第二台服务器,regexp输出应该是:
{服务器地址 - 20.0.0.1邻居组:测试
日期:Jul 08 18:26:32查询待审:
0/1请求方法:循环}
同样,对于第三个服务器,起始分隔符为Server Address
,然后没有其他结束分隔符,例如Server Address
。因此,在这种情况下,它应该找到给定字符串的最后一个字符。
为regexp输出后的第三个服务器应该像
{服务器地址 - 30.0.0.1邻居组:测试
日期:Jul 08 18:26:32查询待审:
0/1请求方法:循环}
答案 0 :(得分:2)
对于更新的问题,模式rose.*?flower
似乎可以解决问题。
% set string {rose is an flower rose is an flower rose is a flower rose is a color and an flower}
% set pat rose.*?flower
% regexp -all -inline $pat $str
{rose is an flower} {rose is an flower} {rose is a flower} {rose is a color and an flower}
(为清楚起见,未引用其他命令回声。)
我怀疑你真的想做更一般的事情,但我只能回答你提出的问题。
答案 1 :(得分:1)
根据您的修订问题,您需要一个非常糟糕的RE来获得您想要的内容:
% regexp -all -inline {rose(?:\s*(?!rose)\S)*} $string
{rose is an flower} {rose is an flower} {rose is a flower} {rose is not a place}
如果你不介意一些额外的空格,你可以使用这个更简单的空格:
% regexp -all -inline {rose(?:(?!rose).)*} $string
{rose is an flower } {rose is an flower } {rose is a flower } {rose is not a place}
但是,我认为你并没有告诉我们你正在做的事情是什么。正则表达式非常特定于您尝试做的事情;概括它们并不是一件容易的事。