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

POSIX sh技术问询:如何将完整文件读入单个字符串并保留空白与换行

在POSIX sh中完整读取文件到单个变量(保留所有空白和换行)

嘿,我完全懂你的困扰——之前找的方案都是逐行处理,没法直接把整个文件原封不动塞进一个变量里,而且你自己试的循环拼接法还会在末尾多出来个多余的换行,确实头疼。

给你一个完全符合POSIX标准的解决方案,能完美保留文件里的所有空白、换行,包括文件末尾的换行(如果有的话):

#!/bin/sh
# 读取目标文件内容到string变量
string=$(cat "your_file.txt"; printf x)
# 移除最后添加的x字符,恢复原文件内容
string=${string%x}

# 可以用下面的命令验证输出和原文件完全一致
# printf '%s' "$string" | cmp - your_file.txt

为什么这个方法有效?

  • $(cat your_file.txt)会把文件内容读进来,但POSIX的命令替换会自动去掉输出末尾的所有换行符——这也是循环法之外的核心痛点。
  • 我们在cat后面加printf x,相当于给文件内容末尾强行加了一个不会出现在原文件里的字符x,这样命令替换就不会去掉原文件的末尾换行(因为最后一个字符是x,不是换行)。
  • 最后用${string%x}把末尾的x删掉,就得到了和原文件完全一致的内容,包括所有换行和空白。

为什么你的循环拼接法会出问题?

你之前的循环里,每读一行就往字符串里加一个换行,不管原文件的最后一行本身有没有换行。比如:

  • 如果原文件最后一行没有换行,循环会额外加一个,导致多出来一行空白;
  • 如果原文件最后一行有换行,循环会再加一个,变成两个连续换行。

这个问题在循环里很难处理(要判断是不是最后一行),而上面的cat+printf的方法就简洁多了,而且完全符合POSIX标准,在任何兼容sh的环境里都能跑。

内容的提问来源于stack exchange,提问作者Harold Fischer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:26:04