您通常可以流水线操作
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.
特别要注意的是,它的输入可以包括标准输入,而不仅仅是文件。例如,您可以:
混合标准输入和文件
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
答案2
如果你不喜欢 shell 进程替换的巫术,你也可以使用命令组的简单重定向:
{ printf '%s\n' 'header line 1' 'header line 2' ...; tail -c +$(($header_size+1)) old-file.txt; } > new-file.txt