Bash

包含空格的文件名的 sed 無效選項錯誤

  • December 17, 2020
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

腳本的完整程式碼:完整腳本

您的錯誤來自腳本中的以下行:

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 選項不是函式的本地選項,因此設置extglobinget_file_folder_name會將其設置為全域。

也可以看看:

引用自:https://unix.stackexchange.com/questions/624898