Используйте Nifi replaceText, чтобы заменить первое или последнее вхождение символа / строки на другую строку? - PullRequest
0 голосов
/ 04 октября 2018

Попытка добавить тег к входящему файлу 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"}]

Никогда не было хорошо в регулярном выражении ... :( Может кто-то помочь с правильной фразой для поиска и замены? Также, если кто-то может объяснить регулярное выражение и как группировка выполняется, это поможетхорошо. Возможно, хорошая справочная таблица. Что такое хороший сайт для тестирования и анализа определенных выражений регулярных выражений nifi?

РЕШЕНИЕ: Если это поможет кому-то найти шаблон: Значение поиска: ^ (. *?) [{(будет выполнять ленивый поиск до тех пор, пока не найдет первый '[{' и группирует вещи до $ 1), поэтому замена будет: $ 1 {"nifi_received_ts_est": "$ {now (): format (" гггг-ММ-дд ЧЧ: мм: сс.SS ")}",

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

изменить search value на ^(\[\{)(.*)

, в этом случае первая группа (\[\{) будет соответствовать первым двум символам

, а вторая группа (.*) остальной части строки

0 голосов
/ 04 октября 2018

Я не уверен, почему вы пытаетесь использовать регулярное выражение здесь.Правильный подход заключается в том, чтобы декодировать строку 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;
...