sed: -e 표현식 #1, 문자 1: 알 수 없는 명령: `"'

sed: -e 표현식 #1, 문자 1: 알 수 없는 명령: `"'

FILEbash에 해당 RT값 을 .FILETTT

작업:

FILE="BlazeRT 123"
source_dir=BlazeRT
target_dir=BlazeTTT
newfile="$(echo ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\")"

오류가 발생합니다.

sed: -e expression #1, char 1: unknown command: `"'

shell eval 실행시 오류가 발생하는 것 같습니다 echo ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\".

이제 마지막 명령을 수정하는 방법을 알고 싶습니다.

미리 감사드립니다!

답변1

실행하려는 코드에는 약 4가지 문제가 있습니다.

  • 표현식 주위에 큰따옴표 문자를 이스케이프 처리하고 있습니다 sed. 그렇게 하면 sed실행하려는 표현식의 큰따옴표 부분이 만들어집니다 . 에는 "명령이 없으므로 sed유틸리티는 "알 수 없는 명령"이라고 불평합니다. 큰따옴표를 이스케이프 처리하지 않으면 이 문제를 해결할 수 있습니다.
  • $FILE따옴표 없이 사용합니다 . 따라서 쉘은 값을 문자(기본적으로 공백, 탭 및 줄 바꿈)별로 분할 $IFS하고 결과 단어에 대해 파일 이름 생성(globbing)을 수행합니다. 큰따옴표 확장을 통해 $FILE이를 수정할 수 있습니다.
  • 어떤 경우에는 유틸리티가 echo이스케이프 시퀀스를 확장하여 출력하는 데이터를 수정합니다(예: 출력하는 문자열에 나타나는 경우). 따라서 출력할 내용을 확인하려면 정적 문자열에만 사용해야 합니다. 다른 모든 경우에는 .\t\nechoprintf
  • 또는에 슬래시가 포함되어 있으면 sed기본적으로 슬래시가 명령 구분 기호로 사용되므로 명령이 실패합니다. 다행히 이 명령에서는 다른 구분 기호를 사용하는 것이 쉬우므로 데이터에 표시되지 않는 구분 기호를 선택해야 합니다. 불행하게도 값을 정규 표현식이 아닌 고정 문자열로 해석하려는 경우 피해야 할 몇 가지 다른 하위 문자열과 문자가 있습니다. 또한 두 번째 문자열에는 하위 문자열이 포함되지 않을 수도 있습니다.$source_dir$target_dirs///sedsed$target_string\1\2&

sed이 경우 매개변수 대체를 사용 하는 것보다 쉘 자체에서 매개변수 대체를 사용하는 것이 더 효율적이고 안전합니다. 쉘은 쉘 패턴과 일치하는 모든 부분 문자열을 바꾸는 bash것과 같은 작업을 수행할 수 있습니다 ( 부분 문자열의 첫 번째 항목만 바꾸려면 단일 대체 사용).${variable//pattern/word}pattern$variableword///

newfile=${FILE/"$source_dir"/$target_dir}

$source_dir해당 값을 와일드카드 패턴으로 사용하는 것을 피하기 위해 큰따옴표를 사용합니다 .

관련 정보