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 -x
sed 명령줄의 내용도 표시되지만 출력에서 리터럴 줄 바꿈에 주의해야 합니다.
따라서 앞에 개행 문자가 하나만 있는 경우 스크립트 시작 부분에서 이를 제거할 수 있습니다.
to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}
(이들을 하나로 결합할 수 있지만 개행 문자가 없어도 별도의 단계가 작동합니다.)
답변2
이 시도
sed -i -e "s@$to_replace@$replace_with@g" "$entry"
어디
-i
-i
대체가 사용되지 않은 경우 표준 출력에 있는 "제자리" 대체를 의미합니다 .