Есть ли способ отличить несколько многострочных выходов из скрипта? - PullRequest
0 голосов
/ 03 июня 2019

Я запускаю скрипт input.sh, который имеет несколько многострочных выходов, например:

echo -e 'first \n second'
echo -e 'first \n second'
echo -e 'first \n second'

У меня нет контроля над этим файлом, и я могу только знать, что он будет иметь несколько многострочных выходов.

Мне нужно иметь возможность проводить операции с каждым отдельным выводом из этого файла в режиме реального времени, поскольку он выводит сообщения. Буферизация - это одна из проблем, но не та, о которой я здесь спрашиваю.

Я немного упрощаю, но моя проблема сводится к следующему: я хочу вставить кенгуру в конце каждого отдельного вывода. Смотрите мои попытки ниже:

./input.sh | sed 's/$/kangaroo/'

Эта версия выше вставляет кенгуру после каждой новой строки, а не каждого многострочного вывода.

./input.sh | perl -0777 -pe 's/$/kangaroo/'

Эта версия Perl вставляет кенгуру только после того, как все выходы завершены (один итог кенгуру вместо одного кенгуру на выход.)

Я пробовал другие варианты, но это всегда один или другой - кенгуру после каждой новой строки или один кенгуру после всего. Я пытался использовать tr, чтобы заменить новые строки фидами форм, но это не имело никакого значения.

Как это можно сделать?

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

Ответы [ 3 ]

5 голосов
/ 03 июня 2019

Нет способа отличить

echo -e 'first\nsecond'
echo -e 'first\nsecond'
echo -e 'first\nsecond'

от

echo -e 'first\nsecond\nfirst'
echo -e 'second\nfirst\nsecond'

Оба выводят следующий поток байтов (представленный в шестнадцатеричном виде):

66 69 72 73 74 0A 73 65 63 6F 6E 64 0A 66 69 72 73 74 0A 73 65 63 6F 6E 64 0A 66 69 72 73 74 0A 73 65 63 6F 6E 64 0A

Поток не содержит никакой информации о том, что означают эти байты или как они были собраны. В лучшем случае могут быть временные различия.

3 голосов
/ 03 июня 2019

Нет;в общем случае нет способа достоверно определить, были ли два байта выведены отдельно и буферизованы вместе, или выведены вместе.

2 голосов
/ 03 июня 2019

Тебе нужен трюк.

Вы можете попытаться отменить команду echo с помощью собственной оболочки!

echo() {
   printf "%skangeroo\n" "$(/bin/echo $@)"
}

echo -e 'first \n second'
echo -e 'first \n second'
echo -e 'first \n second'
echo "=================="
echo -e 'first \n second \n first'
echo -e 'second \n first \n second'

результат:

first
 secondkangeroo
first
 secondkangeroo
first
 secondkangeroo
==================kangeroo
first
 second
 firstkangeroo
second
 first
 secondkangeroo
...