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
相关产品推荐
相关产品推荐

