Используйте Nifi replaceText, чтобы поменять местами первое или последнее вхождение char/string с другой строкой?

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

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

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

2 ответа

Решение

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

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

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

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