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