Присоединение к потокам

Обычно можно конвейерно обрабатывать операции

a | b | c

где b берет вход от a и отправляет его в c. Это имеет только один вход, сгенерированный a. Но что, если я хочу заменить заголовок в файле b. Я поэтому повторяю новый заголовок (это a операция). Кроме того, я cat b | dd bs=1 skip=header_size разделять заголовок из файла. Это bc операция. Теперь у меня есть два вывода, произведенные echo new_header и cat. Как я связываю их?

-1
задан 22 June 2016 в 21:47

2 ответа

Вы спросили, "Как я связываю их?" - и ответ, вполне просто, с 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.


Примечание в особенности, что его исходные данные могут включать стандартный вход, не просто файлы. Так, например, Вы можете:

  1. вход стандарта соединения и файлы

    echo "new text" | cat - oldfile > newfile
    
  2. вход стандарта соединения и замены процесса

    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
3
ответ дан 29 September 2019 в 01:41

Если Вам не нравится вуду замены процесса оболочки, можно также использовать простое перенаправление оперативной группы штаба:

{ printf '%s\n' 'header line 1' 'header line 2' ...; tail -c +$(($header_size+1)) old-file.txt; } > new-file.txt
0
ответ дан 29 September 2019 в 01:41

Другие вопросы по тегам:

Похожие вопросы: