【问题标题】:Read entire file to variable, keeping escaped characters intact将整个文件读入变量,保持转义字符不变
【发布时间】:2017-02-16 13:12:15
【问题描述】:

假设我有以下文件:

hello\nworld

也就是说,字符串\n 确实存在于文件中:

$ cat input.txt
hello\nworld

我想将这个文件完全像读取到 shell 中的变量一样。但是,从文件中读取数据的所有常用方法,例如 here 中描述的那些方法,都会使 shell 将 \n 序列解释为换行符:

% test="$(<input.txt)"
% echo "$test"        
hello
world
% test="$(cat input.txt)"
% echo "$test"
hello
world

这完全出乎我的意料,坦率地说,我很困惑,我在互联网上找不到这个问题的答案;我预计有人已经被这个问题绊倒了。

我还看到,如果你在逐行读取文件时使用read -r,它可以工作,但我不想逐行读取,我想读取整个文件。具体来说,我希望这里的 test 变量包含字符串 "hello\nworld" 字面意思。我该怎么做?

【问题讨论】:

  • 您的echo 是否别名为echo -e
  • @gudok 不,不是。
  • type echowhich echo 告诉我们什么?
  • 读取文件不是问题; echo 是,因为 zsh 遵循 POSIX 规范来扩展 \nbash 没有。请改用printf '%s' "$test"
  • @Yarden 以上是正确的。反引号不显示,但这是相同的:VAR=$(cat file) - 即test=$(cat input.txt)

标签: bash shell echo zsh


【解决方案1】:

您或许可以使用read -r -d '' &lt;input.txt 在单个字符串中读取整个文件。

但是,在我的测试中,我没有得到这种行为。也许你的echo 会做出这样的解释。试试printf "%s" "$test" 看看能不能解决问题。

【讨论】:

  • 哇,printf 技巧确实奏效了,所以看起来$(&lt;file) 可以正常工作。看来这确实是echo的问题。也就是说,我现在记得我实际上使用的是 zsh 而不是 bash,可能是因为 zsh。
  • 是的,我在 zsh 文档中发现默认情况下 echo 会扩展转义字符,并且必须提供 -E 选项才能将其关闭。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 2014-07-06
  • 2012-07-29
  • 2011-04-02
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多