Shell Scripting不想要的'?'文件名末尾的字符

时间:2012-11-06 19:37:35

标签: bash shell cp

我得到了一个不想要的'?'在执行此操作时,在我的文件名末尾:

emplid=$(grep -a "Student ID" "$i".txt  | sed 's/(Student ID:  //g' | sed 's/)Tj//g' ) 
 #gets emplid by doing a grep from some text file
echo "$emplid"   #prints employee id correctly 
cp "$i" "$emplid".pdf  #getting an extra '?' character after emplid and before .pdf

,而不是像123456.pdf那样得到文件名,我得到了123456?.pdf。 如果回声正确打印,为什么会发生这种情况? 如何删除尾随问号字符?

2 个答案:

答案 0 :(得分:9)

听起来你的脚本文件有DOS风格的行结尾(\ r \ n)而不是unix-style(只是\ n) - 当这种格式的脚本时,\ r被视为命令的一部分。在这个例子中,它被包含在$ emplid中,因此包含在文件名中。

许多平台都支持dos2unix命令将文件转换为unix样式的行结尾。一旦它被转换,坚持使用支持unix样式文本文件的文本编辑器。

编辑:我假设问题行结尾是在shell脚本中,但看起来它们在输入文件(“$ i”.txt)中。您可以在输入文件上使用dos2unix来清理它和/或在脚本中的sed命令中添加清理步骤。顺便说一句,您可以使用-e选项使用sed应用多个编辑的单个实例:

emplid=$(grep -a "Student ID" "$i".txt  | sed '-e s/(Student ID:  //g' -e 's/)Tj//g' -e $'s/\r$//' )

我建议使用sed 's/.$//' 反对 - 如果文件采用unix格式,则会切断文件名的最后一个字符。

答案 1 :(得分:0)

使用file命令检测它是纯Unix还是与DOS混合。

DOS文件:ASCII文本,与CRLF行终止符

Unix文件是纯ASCII文件。