Bash 读取忽略前导空格

2024-03-14

我有文件a.txt包含以下内容

    aaa
    bbb

当我执行以下脚本时:

while read line
do
    echo $line
done < a.txt > b.txt

生成的b.txt包含以下内容

aaa
bbb

可以看出,行的前导空格已被删除。如何保留前导空格?


Bash FAQ 条目对此进行了介绍逐行读取数据 http://mywiki.wooledge.org/BashFAQ/001#Trimming.

读取命令修改读取的每一行;默认情况下,它会删除所有前导和尾随空白字符(空格和制表符,或 IFS 中存在的任何空白字符)。如果不需要,则必须清除 IFS 变量:

# Exact lines, no trimming
while IFS= read -r line; do
  printf '%s\n' "$line"
done < "$file"

正如查尔斯·达菲(Charles Duffy)正确指出的那样(我因专注于IFS问题);如果你想看到输出中的空格,你还需要在使用变量时引用它,否则 shell 将再次删除空格。

请注意与原始代码相比,引用的代码片段中的一些其他差异。

使用-r论证read包含在先前链接页面顶部的一句话中。

读取的 -r 选项可防止反斜杠解释(通常用作反斜杠换行符对,以继续多行)。如果没有此选项,输入中的任何反斜杠都将被丢弃。您几乎应该始终将 -r 选项与 read 一起使用。

至于使用printf代替echo那里的行为echo不幸的是,它在所有环境中都不是可移植的一致的,并且这些差异可能很难处理。printf另一方面是一致的并且可以完全稳健地使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 读取忽略前导空格 的相关文章

随机推荐