这个问题及其答案显示了现有文件(“processedFile”)的内容可以插入到另一个现有文件(“receivingFile”)中,然后再插入其中的一个模式,例如:
sed -i -e '/pattern/r processedFile' receivingFile
有时,此类内容可能来自先前的 command-unit,并且尚未写入。
那时,是否可以将命令单元的结果插入到接收文件中而不创建/写入已处理文件?
例子:
someFile
比如说,我们进行如下预处理(从第 4 行开始读取其内容到文件末尾):
awk 'NR>3' someFile
现在,无需将其写入新文件,我们希望将其直接插入到 receivedFile 的模式之前,这样:
awk 'NR>3' someFile | <insertion commands>
PS:最好使用awk
or sed
。
根据@RomanPerekhrest 的要求,
一些文件:
# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
预处理:
awk 'NR>3' someFile
:
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
接收文件:
stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.
我不知道它是否在所有 *NIX 上都是可移植的,具体取决于实现。它在我的 Linux Debian 上运行。
TL;DR:
/dev/stdin
用作包含文件,这是 sed 的输入,将在管道之前获取命令的输出,例如示例:目标文件内容称为
receivingFile
:输入样本称为
someFile
:在模式之后插入:
要在模式之前插入,请重用由 OP 链接的答案并转储到输出:
要执行所要求的操作并替换文件:
接收文件的新内容:
更新:正如@don_crissti 所指出的,如果模式是最后一行,这将不起作用。这是另一个命令,改编自他对同一个链接问题的回答!需要一些其他命令来适应额外空白行的临时添加(和 sed 抑制)。这两个会起作用:
或者只是(不需要 bash 并离开
sed -i
来处理最终文件):查看分行 sed 代码的链接答案。
只需使用
ex
POSIX 指定的脚本形式vi
(也是 POSIX 指定的)。或更一般地说:
使用 sed (GNU sed) 4.4