POSIX sh:如何仅使用 shell 将整个文件读入单个字符串,同时在原始文件中保留空格和换行符?



在每个人都惊慌失措并说这是一个重复之前,我想指出,虽然有很多关于逐行读取文件的问题,但我发现没有一个是关于将整个文件存储到单个变量中。相反,大多数问题似乎是关于在读取时对每一行执行某种操作。例如,请考虑以下内容:

#!/bin/sh
while IFS='' read -r line || [ -n "$line" ]; do
echo "$line"
done < file

我似乎无法为我的特定目的实现它。当我执行以下操作时:

#!/bin/sh
newline='
'
string=''
while IFS='' read -r line || [ -n "$line" ]; do
string="$string""$line""$newline"
done < file
echo "$string"

我几乎到达那里,但现在末尾有一个额外的换行符,我的字符串不等于我的文件。我已经玩了很长时间了,我似乎无法读取文件,因此我生成的字符串与我的文件完全相同。

您无条件地添加一个换行符,带有string="$string""$line""$newline"赋值。

read只要成功读取一行(包括换行符(,就会返回 true。检查$line是否包含任何内容会处理可能的最终行片段。但是当你处理它时,你不需要添加换行符,因为它一开始就不存在。只要没有最后的行片段,脚本就可以正常工作。

通过将[ -n "$line" ]测试移到循环之外可能是最简单的解决方法:

#!/bin/sh
newline='
'
string=
while IFS= read -r line; do
string="$string$line$newline"
done < "$1"
if [ "$line" ]; then
string="$string$line"
fi
echo "<$string>"       # markers for clarity

当然,也可能是输入文件只有完整的行,而额外的换行符是echo打印的换行符。使用printf "%s" "$string"仅打印变量的内容,而不打印换行符或其他任何内容。有些 shellecho -n抑制最后的换行符,但这是不标准的。

相关内容

最新更新