You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本读取文本文件追加内容错位问题求助

问题:Shell脚本追加文本到行尾时内容错位,追加内容覆盖行首

编写了一个简单的Shell脚本,用于读取文本文件的行并进行文本处理。期望在每行末尾追加指定文本(如_20221116),但实际运行结果出现内容错位,追加内容跑到行首覆盖了部分原内容。以下是示例文件、脚本及运行结果:

文件内容:file.txt

/aaa/bbb/aaaaaaaa.java
/aaa/bbb/bbbbbbbb.js
/aaa/bbb/cccccccc.xml

脚本内容:test.sh

#!/bin/bash

append=_20221116
while read line ; do
    echo " "
    echo "line : "$line
    line=$line$append
    echo $line
done < file.txt

echo " "
echo "### with variable text"
line=/aaa/bbb/ccc.txt
echo $line
echo $line"_20221116"

运行结果

[root@deploy]# ./test.sh
line : /aaa/bbb/aaaaaaaa.java
_20221116aaaaaaaa.java

line : /aaa/bbb/bbbbbbbb.js
_20221116bbbbbbbb.js

line : /aaa/bbb/cccccccc.xml
_20221116cccccccc.xml

### with variable text
/aaa/bbb/ccc.txt
/aaa/bbb/ccc.txt_20221116

问题原因及解决方法

原因分析

问题出在**file.txt的换行符格式**:文件使用了Windows系统的\r\n换行,而非Linux/Unix系统的\n。

当read命令读取带\r的行时,会把\r保留在变量line末尾。拼接append内容后输出时,\r会让光标跳回到当前行开头,后续输出的_20221116就会覆盖行首内容,造成错位。而手动定义的变量没有\r,所以测试正常。

解决方法

1. 转换文件为Unix格式

直接修改文件的换行符:

  • 使用dos2unix工具:
dos2unix file.txt
  • 无dos2unix时用sed:
sed -i 's/\r$//' file.txt

2. 在脚本内处理\r字符

无需修改原文件,在读取时清理\r:

  • 方式一:读取后清理变量
#!/bin/bash

append=_20221116
while read -r line ; do
    # 移除行尾的\r字符
    line=${line%$'\r'}
    echo " "
    echo "line : "$line
    line=$line$append
    echo $line
done < file.txt

echo " "
echo "### with variable text"
line=/aaa/bbb/ccc.txt
echo $line
echo $line"_20221116"
  • 方式二:用tr过滤输入中的\r
#!/bin/bash

append=_20221116
while read line ; do
    echo " "
    echo "line : "$line
    line=$line$append
    echo $line
done < <(tr -d '\r' < file.txt)

echo " "
echo "### with variable text"
line=/aaa/bbb/ccc.txt
echo $line
echo $line"_20221116"

内容的提问来源于stack exchange,提问作者user2242541

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:31:03