如何为文本文件每行末尾拼接.faa字符串?脚本输出异常求助
解决Shell脚本拼接字符串时后缀跑到行首的问题
我来帮你搞定这个问题!你的需求是给delete_names.txt里的每个文件名末尾追加.faa后缀,但执行脚本后后缀跑到了行首,这大概率是两个小问题导致的,咱们一步步解决:
核心原因分析
先看你写的脚本:
while read line; do a='.faa' echo -E "$line$a"; done < delete_names.txt
这里存在两个关键问题:
- 变量赋值与命令的分隔错误:
a='.faa'和echo命令之间没有用分号或换行分隔,导致变量a的赋值并没有在echo的执行环境中生效; - 文件换行符格式问题:如果你的
delete_names.txt是在Windows下创建的,每行末尾会带有Windows风格的回车符(\r),Unix/Linux Shell读取时会把这个字符包含在$line里,输出时\r会让光标跳回行首,.faa就会覆盖行首内容,看起来像是后缀跑到了前面。
解决方案
方案1:先修复文件的换行符(推荐)
如果文件是Windows格式的,先转成Unix格式:
- 用
dos2unix工具(大部分Linux发行版自带):dos2unix delete_names.txt - 如果没有
dos2unix,用sed命令处理:sed -i 's/\r$//' delete_names.txt
方案2:修改脚本同时处理语法和换行符问题
直接调整脚本,既修正语法错误,又自动处理可能的回车符:
while read line; do # 移除行尾可能存在的回车符 clean_line=${line%$'\r'} # 拼接后缀并输出 echo -E "${clean_line}.faa" done < delete_names.txt
这里${line%$'\r'}是Shell的参数扩展语法,专门用来删除字符串末尾的指定字符(这里就是\r),比用管道更高效。
简化版脚本
如果确认文件是Unix格式的,只需要修正语法问题即可:
while read line; do echo -E "${line}.faa" done < delete_names.txt
甚至可以用一行sed命令直接搞定,比while循环更简洁高效:
sed 's/$/.faa/' delete_names.txt
内容的提问来源于stack exchange,提问作者Isabelinho
相关产品推荐
相关产品推荐

