Помимо использования временного файла, чтобы помочь, есть ли способ / программа может буферизовать ввод, stdin
но не выводит содержимое до получения EOF
. Я не хочу использовать переменную оболочки (например buffer=$(cat)
).
Эта программа должна вести себя как показано ниже (предположим, что имя программы buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Теперь, когда программа получила ^D
, buffered-cat
выводит содержимое
line 1
line 2
line 3
sort
для этого. Очевидно, что он имеет побочные эффекты, которые могут быть нежелательными.Ответы:
Бедный человек
sponge
используетawk
:Если у вас есть
tac
, вы можете использовать его тоже:источник
tac
это просто и элегантно, я думаю.| tac | tac
является простым, но имейте в виду , что это крайне неэффективно для выполнения этой задачи , и вы будете страдать от потери производительности, особенно для больших файлов.Вы можете сделать это с помощью
sponge
moreutils .sponge
будет "впитывать стандартный ввод и записывать в файл". Без аргументов этот файл является стандартным выводом. Ввод данных этой команды сохраняется в памяти до EOF, а затем записывается все сразу.Для записи в обычный файл вы можете просто указать имя файла:
Основная цель
sponge
- разрешить чтение и запись из одного и того же файла в конвейере, но он также делает то, что вы хотите.источник
До тех пор, пока вы вводите текст ASCII (не содержит байтов NUL 0x0 до конца), тогда
sed -z
вы делаете то, что хотите:В
-z
причинахsed
для лечения NUL байт в качестве разделителя строки вместо обычной строки. Таким образом, до тех пор, пока ваш ввод представляет собой обычный текст без байтов NUL, sed будет продолжать считывать весь ввод в свой буфер шаблона, пока не будет достигнут EOF.sed
затем не обрабатывает буфер и выводит его.Если в вашем входе присутствуют NUL байты, вы можете сделать это вместо этого:
источник
Это
sed
решение немного длиннее, чем у DigitalTrauma, но также работает с байтами NUL.источник
sed ':l;N;bl'
должно работать тоже.Поведение, которое вы спрашиваете, разве это не поведение по умолчанию для простого кота?
источник
cat
(Enter)Line 1
(Enter) и посмотреть, что получится.Та же идея, что и в примере с muk's awk, за исключением Python. Используйте, CtrlDчтобы остановить чтение в строках
источник
perl -e 'print <>'
(!)