외부 스크립트 파일로 sed - 쉘 변수를 적용하는 방법은 무엇입니까?

외부 스크립트 파일로 sed - 쉘 변수를 적용하는 방법은 무엇입니까?

명령줄에서 직접 작동하는 방법은 다음과 같습니다.

$sed "s/a/X/;s/X/&a&/" file

쉘 변수를 사용하는 경우에도 마찬가지입니다.

$varin=a ; varout=X ; sed "s/$varin/$varout/;s/$varout/&$varin&/" file

하지만 외부 스크립트 파일을 사용하면

$sed -f script.sed file

"하드코딩된" 접근 방식만 작동합니다.

$cat script.sed
s/a/X/
s/X/&a&/

쉘 변수는 확장되지 않지만

$cat script.sed
s/$varin/$varout/
a/$varout/&$varin&/

$varin=a ; varout=X ; sed -f script.sed file
#-> variables in script.sed not interpreted; output unchanged

외부 스크립트 파일에서 쉘 변수의 해석을 구현하는 방법은 무엇입니까 sed?

쉘 변수 자체를 해석할 수 없다는 점은 잘 알고 있지만 sed, 일단 실행한 후 변수를 구문 분석하기 위해 스크립트를 전처리(저장 모드에서)하려면 어떻게 해야 합니까 bash? sed처음에 명령을 사용하여 가져올 수 있을까요 ?

다음 방법은 생산적이지 않습니다( 사용 bash).

  • 사용export varin=a ; export varout=X
  • via sed -e $(cat sed.script) file: 한 줄 스크립트에서 작동하고, 첫 번째 줄에 주석이 있어도 여러 줄 스크립트에서는 실패합니다.
  • sed -f <(cat script.sed) file
  • eval sed -f script.sed file

답변1

envsubst실행하기 전에 스크립트의 변수를 예상 값으로 바꿀 수 있습니다 sed.

$ cat script.sed
s/$varin/$varout/
s/$varout/&$varin&/

문자열 $varin또는 ${varin}$varout또는 ${varout}in을 script.sed해당 변수 값으로 바꿉니다.

$ varin='a' varout='X' envsubst '$varin $varout' <script.sed
s/a/X/
s/X/&a&/

sed프로세스 대체를 사용하는 명령:

sed -f <(varin='a' varout='X' envsubst '$varin $varout' <script.sed) file

답변2

Heredock이 구출하러 옵니다.

varin=a; varout=X
sed -f - <<_CODE_    file
s/$varin/$varout/
_CODE_

그러나 쉘 변수가 적절한 정리 없이 내부적으로 에어드롭되면 이 접근 방식은 버그/잘못된 결과로 가득 차 있습니다. 예를 들어, varout에 문자 등이 포함되어 있으면 &어떻게 될까요?/

관련 정보