sed 包含空格的文件名无效选项错误

sed 包含空格的文件名无效选项错误
 BASE_NAME="$(basename "${1}")"
 FILE_NEW="$(echo "${BASE_NAME}" | sed -e "${REPLACE}")"

这里 $1 指的是传递给函数 REPLACE 变量的文件名:

REPLACE='s/\[NOW\]/'${NOW}'/g;s/\[TODAY\]/'${TODAY}'/g;s/\[DATETIME\]/'${DATETIME}'/g;s/\[RANDOM\]/'${RANDOM_NUMBER}'/g;s/\[NAME\]/'${NAME}'/g;s/\[FILENAME\]/'${FILENAME}'/g'

我想要做的是通过替换上述模式来使用 sed 运算符修改文件名。但是,当我遇到一个包含空格后跟“-”的文件时,它们会产生问题。例如,查看以下文件名:

file -2.txt
file -3.txt
file -e.txt

在所有这些情况下,抛出的错误如下:

sed: invalid option -- '2'
sed: invalid option -- '3'
sed: -e expression #1, char 1: unknown command: `.'

如果文件名只包含空格且没有“-”,仍然存在问题:

file name.txt

会出现以下错误:

sed: can't read ./file: No such file or directory
sed: can't read name.txt: No such file or directory

脚本的完整代码:完整脚本

答案1

您的错误来自脚本中的以下行:

sed -i $REPLACE $1

这同时使用了REPLACE变量和$1不带引号的变量,这意味着 shell 会将这些单词拆分为空格、制表符和换行符上的单词(然后另外处理这些单词的文件名通配模式)。然后将给出这些词作为单独的参数sed

你可能会逃脱使用

sed -i -e "$REPLACE" -- "$1"

您的函数中还有一些未加引号的变量clone_directory

  rename_file ${dir_name}
  ROOT=$FILE_NEW
  cd $ROOT

并且也在您的replace_tags函数中(请注意,{...}通常不需要使用变量名称,并且是不是相当于引用变量)。

另请注意,shell 选项不是函数的本地选项,因此设置extglobget_file_folder_name全局设置它。

也可以看看:

相关内容