명령줄에서 직접 작동하는 방법은 다음과 같습니다.
$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에 문자 등이 포함되어 있으면 &
어떻게 될까요?/