문제

SED를 사용하여 파일 내부의 변수를 확장하고 싶습니다.

변수 변수 = 무언가를 내보내고 다음과 같은 "테스트"파일이 있다고 가정합니다.

I'd like to expand this: "${VARIABLE}"

나는 다음과 같은 명령을 시도했지만 아무 소용이 없습니다.

cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

결과는 변수가 여전히 확장되지 않은 "outputfile"입니다.

I'd like to expand this: "${VARIABLE}"

아직도, 달리기 eval "echo '${VARIABLE}' Bash Console에서 "무언가"가 울려 퍼지는 가치가 있습니다. 또한, 나는 테스트했고 그 패턴은 트룰리가 일치하고 있습니다.

원하는 출력이 될 것입니다

I'd like to expand this: "something"

누구든지 이것에 대해 빛을 발할 수 있습니까?

도움이 되었습니까?

해결책

평가판 버전을 고려하십시오.

cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

이것이 작동하지 않는 이유는 쉘 부분에 사전 과학이 필요하기 때문입니다. SED 스크립트는 SED와 패턴이 일치하기 전에 생성되므로 쉘은 귀하를 위해 해당 작업을 수행 할 수 없습니다.

나는 과거에 이것을 몇 가지 방법으로했다. 일반적으로 알려진 변수와 그 값 목록이 있었고 그 목록에서 대체를 수행했습니다.

for var in PATH VARIABLE USERNAME
do
    echo 's%${'"$var"'}%'$(eval echo "\$$var")'%g'
done > sed.script

cat test | sed -f sed.script > outputfile

변수를 임의로 매핑하려면 변수 이름의 고정 된 목록 대신 전체 환경을 처리해야합니다. env, 적절하게 편집) 또는 대신 Perl 또는 Python을 사용하십시오.

환경 변수의 값에 버전에 슬래시가 포함 된 경우 S /// 표기법의 필드 분리기로 슬래시를 사용하는 문제가 발생합니다. 환경 변수가 상대적으로 적은 환경 변수를 사용하기 때문에 '%'를 사용했지만 '%'문자가 포함 된 일부 기계에서 발견되므로 완전한 솔루션이 까다 롭습니다. 또한 값의 백 슬래시에 대해 걱정해야합니다. 당신은 아마도 '와 같은 것을 사용해야 할 것입니다.$(eval echo "\$$var" | sed 's/[\%]/\\&/g')'환경 변수의 값에서 백 슬래시와 기호를 피하기 위해. 최종 주름 : 일부 버전 sed 스크립트 크기에 대한 용량이 제한되어 있거나 (또는) - 이전 버전의 HP -UX는 약 100의 한계가있었습니다. 그것이 여전히 문제인지 확실하지 않지만 최근 5 년 전 이었는지 확실하지 않습니다.

원본 스크립트의 단순한 적응은 다음과 같습니다.

env |
sed 's/=.*//' |
while read var
do
    echo 's%${'"$var"'}%'$(eval echo "\$$var" | sed 's/[\%]/\\&/g')'%g'
done > sed.script

cat test | sed -f sed.script > outputfile

그러나 더 나은 솔루션은 이미 출력에 값이 있다는 사실을 사용합니다. env, 우리는 다음을 쓸 수 있습니다.

env |
sed 's/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%${\1}%\2%/' > sed.script
cat test | sed -f sed.script > outputfile

쉘은 평가해서는 안되는 것을 평가하지 않기 때문에 이것은 완전히 더 안전합니다. 가변 값의 쉘 메타 카라터에주의를 기울여야합니다. 이 버전은 일부 출력에서만 문제가 발생할 수 있습니다. env 기본적이라고 생각합니다.

조심 - 글쓰기 sed 스크립트 sed 난해한 직업이지만 좋은 도구의 힘을 보여주는 직업입니다.

이 모든 예제는 임시 파일을 정리하지 않아도됩니다.

다른 팁

아마도 SED를 사용하지 않고 갈 수 있습니다.

$ echo $VARIABLE
something
$ cat test
I'd like to expand this: ${VARIABLE}
$ eval "echo \"`cat test`\"" > outputfile
$ cat outputfile
I'd like to expand this: something

쉘 가변 보간이 작업을 수행하도록하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top