변수와 함께 sed 명령 사용

변수와 함께 sed 명령 사용

Stack Overflow 및 관련 웹사이트에서 가능한 모든 해결 방법을 시도했지만 어떤 해결 방법도 찾지 못했습니다. 나는 이 문제에 대해 상당한 시간을 소비했고 마침내 이 질문을 게시하게 되었습니다.

sed쉘 변수와 함께 명령을 사용하고 싶습니다 . 내 스크립트는 매우 간단합니다.

## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace

##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with

## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry  ## $entry is the variable that contains the file name

echo명령은 각각 다음과 같은 출력을 제공합니다.

PARTITIONEDED BY (date_key );  ## the text I want to be replaced
PARTITIONED BY ( date_key int );  ## the text I want to replace with

오류가 발생합니다.

sed: -e expression #1, char 2: unterminated `s' command

또는 텍스트가 전혀 대체되지 않습니다.

누군가 도와주세요. 저는 Centos 6을 사용하고 있습니다(중요한 경우). 미리 감사드립니다!

답변1

sed: -e expression #1, char 2: unterminated `s' command

오류 메시지에는 두 번째 문자에서 오류가 발생한다고 나와 있는데, 이상하게 보입니다. 첫 번째 변수의 시작 부분에 개행 문자를 넣어 이를 재현할 수 있습니다.

$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command

이스케이프되지 않은 개행 문자는 sed 명령을 종료합니다. 개행 문자를 나중에 넣으면 a물론 이후 문자에 오류가 발생합니다.

스크립트 앞부분에서 두 변수를 모두 인쇄했지만 인용되지 않았으므로 앞의 공백이 제거되고 중간의 공백이 단일 공백으로 표시됩니다.

다음과 같이 변수에 실제로 무엇이 포함되어 있는지 확인하세요.

printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"

후자는 Bash가 입력으로 받아들이는 방식으로 인용된 문자열을 표시하는 Bash 기능입니다. set -xsed의 명령줄로 이동하는 내용도 표시되지만 출력에서 ​​리터럴 줄 바꿈을 확인해야 합니다.

따라서 앞에 줄 바꿈이 하나만 있으면 스크립트 시작 부분에서 이를 제거할 수 있습니다.

to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}

(이들을 하나로 결합할 수 있지만 개행 문자가 없더라도 별도의 단계가 작동합니다.)

답변2

이 시도

sed -i -e "s@$to_replace@$replace_with@g" "$entry"

어디

  • -i"제자리에서" 교체를 의미합니다. 교체를 사용하지 않으면 -i표준 출력에 표시됩니다.

관련 정보