Замените строку даты в sed с выходом пользовательской функции с аргументами - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть скрипт bash, который выводит html-файл, подобный этому ./foo.sh > out.html В html есть метки времени в следующем формате 2019-02-24T17:02:19Z.

Я написал функцию для преобразования метки времени в дельту времени между меткой времени и сейчас.

my_uptime(){
    START=$(date -d "$1" "+%s")
    NOW=$(date "+%s")
    STD=$(echo "($NOW-$START)/3600" | bc)
    MIN=$(echo "(($NOW-$START)/60)%60" | bc)
    echo "Uptime $STD h $MIN min"
}

Теперь я хочу заменить метку времени на вывод my_uptime непосредственно впоток.Я пробовал это:

echo "<p>some html</p>
2019-02-24T17:02:19Z
<p>some more html</p>" | sed -r "s/[0-9\-]+T[0-9:]+Z/$(my_uptime \0)/"

Это не удалось, потому что подстановка команд не распознает обратную ссылку и вставляет литерал 0.Есть ли другой способ добиться этого?Желательно прямо в потоке.

1 Ответ

0 голосов
/ 25 февраля 2019
... | sed -r "s/[0-9\-]+T[0-9:]+Z/$(my_uptime \0)/"

Этот код пытается передать совпадающее значение из sed * s/// в функцию оболочки.Тем не менее, $(...) раскрывается до того, как sed даже видит его.

Использование sed, вероятно, здесь неуместно.

Вот замена perl, которая эффективно комбинирует вашу функцию оболочки и sed:

... | perl -ple '
    if (/([0-9-]+T[0-9:]+Z)/) {
        $s = `date -d "$1" +%s`;
        $n = time;
        $h = int(($n-$s)/3600);
        $m = int(($n-$s)/60)%60;
        $_ = "Uptime $h h $m min";
    }'

Возможно, вы могли бы сделать что-то подобное в awk.

...