我得到了一个不想要的'?'在执行此操作时,在我的文件名末尾:
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。 如果回声正确打印,为什么会发生这种情况? 如何删除尾随问号字符?
答案 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文件。