![변수에서 특수 문자를 이스케이프합니다. [중복]](https://linux55.com/image/226260/%EB%B3%80%EC%88%98%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%88%98%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%9D%B4%EC%8A%A4%EC%BC%80%EC%9D%B4%ED%94%84%ED%95%A9%EB%8B%88%EB%8B%A4.%20%5B%EC%A4%91%EB%B3%B5%5D.png)
나는 가지고있다
#!/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
숫자는 어디에 있습니까?, 해당 역참조 표현식과 일치하는 텍스트로 대체되어야 합니다. [...] 을 위한 서로의 백슬래시('\
')가 나타나면 다음 문자는 특별한 의미를 잃습니다.(그렇다면).