连接流

连接流

您通常可以流水线操作

a | b | c

其中b从 接收输入a并将其发送到c。它只有一个输入,由 a 生成。但是,如果我想替换文件 中的标题,该怎么办?b因此,我回显一个新标题(这是a操作)。此外,我cat b | dd bs=1 skip=header_size要从文件中删除标题。这是bc操作。现在我有两个输出,分别由echo new_header和生成cat。我该如何连接它们?

答案1

你问“我如何将它们连接起来?” - 答案很简单,使用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

答案2

如果你不喜欢 shell 进程替换的巫术,你也可以使用命令组的简单重定向:

{ printf '%s\n' 'header line 1' 'header line 2' ...; tail -c +$(($header_size+1)) old-file.txt; } > new-file.txt

相关内容