변수와 함께 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대체가 사용되지 않은 경우 표준 출력에 있는 "제자리" 대체를 의미합니다 .

관련 정보