공백이 포함된 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따옴표가 없는 변수를 모두 사용합니다. 즉, 쉘은 이러한 단어를 공백, 탭 및 줄 바꿈의 단어로 분할합니다(그런 다음 이러한 단어에 대한 파일 이름 글로빙 패턴을 추가로 처리합니다). 그러면 이 말이 주어질 것이다.별도의 매개변수로도착하다 sed.

당신은 사용하여 도망 갈 수 있습니다

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

또한 함수에 인용되지 않은 변수가 있습니다 clone_directory.

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

그리고 replace_tags함수에서도( {...}일반적으로 변수 이름을 사용할 필요가 없으며아니요참조 변수와 동일합니다).

또한 쉘 옵션은 함수에 대해 로컬이 아니므로 설정하면 전역적으로 extglob설정됩니다 get_file_folder_name.

또한보십시오:

관련 정보