You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需临时文件直接将Here文档内容插入输出文件指定位置?

当然可以!完全不用依赖临时文件就能实现这个需求,我给你几个简洁可靠的方案:

方案1:用sed直接读取标准输入(最简洁)

利用sed的r命令可以读取内容插入指定行的特性,我们让它读取/dev/stdin(标准输入),同时把Here文档直接传给sed的标准输入,完美跳过临时文件:

# GNU sed 版本
sed -i '10 r /dev/stdin' outputfile <<-EOT
some string
another string
and another one
EOT

如果是在 macOS 或其他使用 BSD sed 的系统上,-i 参数需要加一个空字符串来指定备份后缀(这里不需要备份,所以用空串):

# BSD sed(macOS)版本
sed -i '' '10 r /dev/stdin' outputfile <<-EOT
some string
another string
and another one
EOT

方案2:用awk实现(更灵活)

如果你需要更复杂的逻辑,awk是更好的选择。GNU awk 支持-i inplace参数,可以直接修改原文件,不需要临时文件:

awk -i inplace -v insert_line=10 '
    # 先把Here文档的内容读到数组里
    BEGIN {
        while ((getline line < "/dev/stdin") > 0) {
            lines[++count] = line
        }
    }
    # 到指定行时输出数组内容
    NR == insert_line {
        for (i=1; i<=count; i++) {
            print lines[i]
        }
    }
    # 打印原文件的每一行
    1
' outputfile <<-EOT
some string
another string
and another one
EOT

这个方案的好处是可以轻松调整插入位置(修改insert_line变量的值就行),还能扩展更多处理逻辑。

小提示

  • 如果你用的是较旧的系统,/dev/stdin可能不可用,这时候可以用进程替换<<(cat <<-EOT ... EOT),不过第一种方案在现代系统里已经足够好用了。
  • 不管用哪种方法,建议先在测试文件上验证效果,避免误改重要文件。

内容的提问来源于stack exchange,提问作者p.la

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:48:18