Обычно можно конвейерно обрабатывать операции
a | b | c
где b
берет вход от a
и отправляет его в c
. Это имеет только один вход, сгенерированный a. Но что, если я хочу заменить заголовок в файле b
. Я поэтому повторяю новый заголовок (это a
операция). Кроме того, я cat b | dd bs=1 skip=header_size
разделять заголовок из файла. Это bc
операция. Теперь у меня есть два вывода, произведенные echo new_header
и cat
. Как я связываю их?
Вы спросили, "Как я связываю их?" - и ответ, вполне просто, с cat
:
NAME
cat - concatenate files and print on the standard output
SYNOPSIS
cat [OPTION]... [FILE]...
DESCRIPTION
Concatenate FILE(s), or standard input, to standard output.
Примечание в особенности, что его исходные данные могут включать стандартный вход, не просто файлы. Так, например, Вы можете:
вход стандарта соединения и файлы
echo "new text" | cat - oldfile > newfile
вход стандарта соединения и замены процесса
echo "new text" | cat - <(some_command oldfile) > newfile
, например,
echo "new header" | cat - <(dd if=oldfile bs=1 skip=$header_size) > newfile
, С другой стороны, Вы могли использовать здесь документ и встроить вывод команды с помощью замена команды - это - вероятно, более оптимальный вариант, если текст замены состоит из больше, чем одна строка, например,
$ cat > newfile << EOF
new
multi-line
header
$(dd if=oldfile bs=1 skip=$header_size)
EOF
Если Вам не нравится вуду замены процесса оболочки, можно также использовать простое перенаправление оперативной группы штаба:
{ printf '%s\n' 'header line 1' 'header line 2' ...; tail -c +$(($header_size+1)) old-file.txt; } > new-file.txt