如何将命令输出直接插入到文件中的模式之前?

如何将命令输出直接插入到文件中的模式之前?

这个问题它的答案显示现有文件(“processedFile”)的内容可以插入到另一个现有文件(“receivingFile”)的其中一个文件之前图案s 里面,这样:

sed -i -e '/pattern/r processedFile' receivingFile

有时,此类内容可能源自前一个指挥单位,而且还没有写。

那时,是否可以将命令单元的结果插入到receiveFile中而不创建/写入processedFile?

例子:

比如说,我们预处理someFile如下(从第4行开始读取其内容到文件末尾):

awk 'NR>3' someFile

现在,无需将其写入新文件,我们想直接将其插入到receivingFile中之前图案这样:

awk 'NR>3' someFile | <insertion commands>

PS:最好使用awksed


根据@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.

答案1

我无法判断它是否可以跨所有 *NIX 移植,具体取决于实现。它在我的 Linux Debian 上运行。

TL;DR:用作/dev/stdin包含文件,它是 sed 的输入,并将在管道之前获得命令的输出,例如

awk 'NR>3' someFile | sed -i -e '/pattern/r /dev/stdin' receivingFile

示例:目标文件内容名为receivingFile

stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.

输入样本名为someFile

# 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 | sed -e '/pattern/r /dev/stdin' receivingFile

要在模式之前插入,请重用OP链接的答案并转储到输出:

awk 'NR>3' someFile | sed -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile

要执行所要求的操作并替换文件:

awk 'NR>3' someFile | sed -i -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile

接收文件的新内容:

stackExchange is the best.
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
pattern
Unix stackExchange is the best of the bests.

更新:正如 @don_crissti 所指出的,如果图案是最后一行。这是另一个命令,改编自他的回答对于相同的链接问题!需要一些其他命令来适应额外空行的临时添加(以及 sed 的抑制)。这两个可以工作:

awk 'NR>3' someFile | sed -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile <(printf '\n') > receivingFile.new
mv receivingFile.new receivingFile

或者只是(不需要 bash 并留下来sed -i处理最终文件):

awk 'NR>3' someFile | { echo '' >> receivingFile; sed -i -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile ; }

看着那(这链接答案用于行分割的 sed 代码。

答案2

只需使用exPOSIX 指定的可编写脚本的形式vi(也是 POSIX 指定的)。

printf '%s\n' '/pattern/-r !awk "NR>3" somefile' x | ex receivingFile

或者更一般地说:

printf '%s\n' '/pattern/-r !somecommand' x | ex somefile

答案3

使用 sed (GNU sed) 4.4

sed -i '/pattern/{h;s/.*/awk "NR>3" somefile/e;p;x}' receivingFile

相关内容