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
相关产品推荐
相关产品推荐

