如何无需临时文件直接将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
相关产品推荐
相关产品推荐

