使用Nifi replaceText可以将char / string的第一个或最后一个出现与另一个字符串交换?

时间:2018-10-04 13:50:48

标签: regex apache-nifi hortonworks-data-platform

尝试将标签添加到传入的nifi json流文件中。

输入:

[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

预期输出:

[{"nifi_received_ts_est":"2018-10-04 09:31:50.108","HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

尝试了不同的方法,现在已经接近:

Search Value: ^([^\[]*)
Replacement Value: [{"nifi_received_ts_est":"${now():format("yyyy-MM-dd HH:mm:ss.SS")}"\,$2
Replacement Strategy: Regex Replace
Evaluation Mode: Entire Text

但是结果不是预期的。到达下面:

[{"nifi_received_ts_est":"2018-10-04 09:31:50.108",$2[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]

对regexp从来都不是好事... :(有人可以帮助您搜索和替换正确的词组吗?另外,如果有人可以解释regexp以及如何进行分组也会有所帮助。也许是一个很好的备忘单参考。一个很好的网站来测试和解析nifi特定的regexp表达式?

解决方案: 如果可以帮助任何人找到该模式:Search Value:^(。*?)[{(将进行惰性搜索,直到找到第一个'[{'并将其之前的内容分组到$ 1)为止,因此替换将是:$ 1 {“ nifi_received_ts_est”: “ $ {now():format(” yyyy-MM-dd HH:mm:ss.SS“)}”,

2 个答案:

答案 0 :(得分:4)

search value更改为^(\[\{)(.*)

在这种情况下,第一组(\[\{)将与前两个符号匹配

,第二组(.*)其余字符串

答案 1 :(得分:0)

我不确定您为什么在这里尝试使用正则表达式。正确的方法是将JSON字符串解码为Perl数据结构,将新数据添加到该结构中,然后将其编码回JSON。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use JSON;
use Time::Piece;

my $json_parser = JSON->new;

my $json = '[{"HIT":"DUMMY_3","BatchId":"jkajks981n-1280189nd-129dnbj-2349nbfk","Id":"81274376231"}]';

my $data = $json_parser->decode($json);

$data->[0]->{nifi_received_ts_est} =
  localtime->strftime('%Y-%m-%d %H:%M:%S');

$json = $json_parser->encode($data);

say $json;