处理文本文件后某些字符消失

处理文本文件后某些字符消失

我有一个名为addresses.txt的文件:

[email protected]
[email protected]
[email protected]

我想附和”[电子邮件受保护]“使用 for 循环。这就是我所做的:

cat addresses.txt | while read address
do
echo "${address}.html"
done

结果如下:

[email protected]
[email protected]
[email protected]

如果我在变量和“.html”之间添加空格,结果相同

我想念什么?

谢谢

答案1

发生的情况是该文件采用 Windows 格式,其中换行符由两个字符组合 CR、LF 表示。您使用的 Unix 工具期望换行符以 Unix 方式表示,仅使用 LF 字符。 shell 将 CR(回车符)视为普通字符,因此它成为变量值的一部分address。当您在终端上打印结果时,终端将 CR 字符解释为“返回到当前行的开头”,这就是为什么.htmlCR 后面的位会覆盖行的开头。

你可以转换文件以使用 Unix 换行符

如果您希望代码对于使用 Windows 换行符编码的输入文件具有鲁棒性,您可以通过将 CR 添加到IFS多变的

while IFS="$IFS$(printf '\r')" read address; do
  echo "${address}.html"
done <addresses.txt

另一种解决方案是从值末尾去除 CR 字符(以防它存在),使用参数扩展字符串操作构造。请注意,如果文件实际上包含反斜杠-CR-换行符,则用于续行的反斜杠换行符将不起作用,因此您应该将其关闭以避免混淆。

CR=$(printf '\r')
while read -r address; do
  address=${address%$CR}
  echo "${address}.html"
done <addresses.txt

在 ksh93、bash 和 zsh 中,您可以使用$'\r'代替$(printf '\r').

答案2

有人建议我尝试一下dos2unix addresses.txt,并且可以说这解决了问题。多谢 !!

相关内容