![处理文本文件后某些字符消失](https://linux22.com/image/5047/%E5%A4%84%E7%90%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%90%8E%E6%9F%90%E4%BA%9B%E5%AD%97%E7%AC%A6%E6%B6%88%E5%A4%B1.png)
我有一个名为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 字符解释为“返回到当前行的开头”,这就是为什么.html
CR 后面的位会覆盖行的开头。
你可以转换文件以使用 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
,并且可以说这解决了问题。多谢 !!