bash - 文件名末尾的 Shell 脚本不需要的 '?' 字符

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

最佳答案

听起来您的脚本文件具有 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 格式,那将切断最后一个字 rune 件名。

关于bash - 文件名末尾的 Shell 脚本不需要的 '?' 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258123/

相关文章:

linux - mv命令移动文件,但报告错误: cannot stat no such file or directory

linux - Bash 脚本自动登录 VPN

linux - 如何只在某些字段上执行 awk 命令

linux - 我如何在 ls 命令后搜索特定字符串

linux - 如果两行以相同的表达式开头,则合并文本文件中的两行

xcode - Xcode param ${PROJECT_DIR} 的父目录

具有完整路径的 Linux cp

linux - 提取复杂字符串的片段

linux - 将整个目录结构的每个文件复制到另一个的基本路径中

linux - 可以编写脚本在本地机器上打开多个终端并通过 ssh 连接到不同的服务器吗?