10

我得到一个不需要的“?” 执行此操作时,在我的文件名末尾:

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 。如果 echo 打印正确,为什么会发生这种情况?如何删除尾随问号字符?

4

2 回答 2

12

听起来您的脚本文件具有 DOS 样式的行结尾(\r\n)而不是 unix 样式(只是 \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 格式,那将切断文件名的最后一个字符。

于 2012-11-06T19:45:41.420 回答
0

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

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

Unix 文件是纯 ASCII 文件。

于 2014-01-30T21:31:12.057 回答