
여러 파일의 한 줄을 바꿔야 하는데 sed를 사용하여 솔루션을 찾고 있습니다. 다음 오류가 발생합니다.
sed: -e 표현식 #1, 문자 31: 종료되지 않은 's' 명령
다음 줄이 포함된 bash 스크립트를 실행하려고 할 때:
sed -i.bak "s/some-text-string/some-text-string ${stringVar}/" *.ext
이것이 이 문제를 일으킬 수 있는 공백이라는 것을 알고 있지만 어디에서도 해결책을 찾을 수 없습니다. 교체할 때 공백을 보존해야 합니다. 문자열을 추가하는 것을 고려했지만 다른 기능을 사용하여도 많은 진전을 이루지 못했습니다.
나는 아마도 이 문제에 잘못 접근하고 있고 다른 기능을 사용해야 할 것 같은 느낌이 들지만 sed 또는 bash 경험이 많지 않아서 막혔습니다.
누구든지 가능한 해결책을 밝힐 수 있다면 감사하겠습니다.
답변1
공백이나 탭은 문제를 일으키지 않지만 줄 바꿈으로 인해 sed 명령이 중단될 수 있습니다. 문제는 쉘 변수가 다른 프로그래밍 언어에서 알 수 있듯이 실제 변수가 아니라 매크로와 더 유사하다는 것입니다.
실제 변수를 사용하는 실제 프로그래밍 언어로 전환하면 이 문제가 해결됩니다. 예를 들어 구문을 유사하게 유지하기 위해 Perl 솔루션은 다음과 같습니다.
r=$stringVar perl -i.bak -pe 's/some-text-string/some-text-string$ENV{r}/' -- *.ext
명령에 값을 미리 할당하면 변수가 명령 실행 환경의 일부가 됩니다.