변수에서 특수 문자를 이스케이프합니다. [중복]

변수에서 특수 문자를 이스케이프합니다. [중복]

나는 가지고있다

#!/usr/bin/bash
search="ldo_vrf18 {"
replace="$search"'                      compatible = "regulator-fixed";
                        regulator-name = "vrf18";
                        regulator-min-microvolt = <1800000>;
                        regulator-max-microvolt = <1800000>;
                        regulator-enable-ramp-delay = <120>;'
sed -i "s/$search/$replace/g" output.file

밝혀지다

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

일부 값이 없는 것 같습니다 replace. 이를 피할 수 있는 방법이 있나요? 시도해봤는데 sed -i 's/'"$search"'/'"$replace"'/g' output.file같은 결과 네요

답변1

문제는 명령의 끝 $replace으로 해석되는 변수의 개행 문자 에 있습니다.sed

GNU에서 이 문제를 해결하려면 변수의 새 줄을 text로 바꿔야 sed합니다 .$replace\n

replace=${replace//$'\n'/\\n}

노트:sed위의 솔루션 은 일부 버전(예: GNU)의 확장 기능이므로 모든 구현에서 작동하지 않습니다 sed. ~에 따르면POSIX 표준:

각 내장<줄 바꿈>텍스트 앞에는 백슬래시가 와야 합니다. 텍스트의 다른 백슬래시는 제거되어야 하며 + 이후의 문자는 문자 그대로 처리되어야 합니다.

따라서 POSIX에서 sed리터럴은 \n줄바꿈의 의미를 잃고 리터럴 n문자로 처리됩니다. 모든 구현에서 작동하는 이식 가능한 솔루션의 경우 sed실제 개행 앞에 백슬래시를 추가하세요.

replace=${replace//$'\n'/\\$'\n'}

+ 백슬래시 뒤에 숫자가 오는 경우는 제외:

문자 "\n", n숫자는 어디에 있습니까?, 해당 역참조 표현식과 일치하는 텍스트로 대체되어야 합니다. [...] 을 위한 서로의 백슬래시(' \')가 나타나면 다음 문자는 특별한 의미를 잃습니다.(그렇다면).

관련 정보