2013-08-14 2 views
1

스트림의 모든 변수를 쉽게 바꿀 수 있습니까?스트림에서 bash 변수 바꾸기

콘텐츠가있는 파일이 있다고 가정 해 보겠습니다.

$FOO $BAR $BAZ 

와 나는 그 값과 변수에 대한 모든 참조를 교체해야

less file | replaceVars | process 

replaceVars 단계처럼 뭔가를 할 수 있습니다. 나는 (내가 sed 또는 비슷한 것을 사용할 때 필요한 것처럼) 바꿀 변수를 지정할 필요가 없다. 어딘가에 내장 함수 나 작은 프로그램을 사용하여 bash 파서 나이 대체물을 사용할 수있게합니까?

답변

2

사용 eval는 :

while read -r line; do eval echo "${line}"; done < inputfile | process 

이 프로세스에 출력 배관 전에 inputfile의 변수를 확장한다.

3

function replaceVars { 
    local V IFS= 
    while read -r LINE; do 
     for V; do 
      LINE=${LINE//"$V"/"${!V}"} 
     done 
     echo "$LINE" 
    done 
} 

같은 함수를 작성하고이 같은 스트림에서 호출 할 수 있습니다 : 정말 표준 출력하지만, 상호 작용하지 않는

cat file | replaceVars FOO BAR BAZ | process 

내가 less 이후 lesscat 교체 터미널 자체. 당신은뿐만 아니라이 대신 할 수있는 :

replaceVars FOO BAR BAZ < file | process 

당신이 배열에서 그 변수 이름을 저장하려면이처럼 할 수 있다면 : 그런데

VARS=(FOO BAR BAZ) 
replaceVars "${VARS[@]}" < file | process 

는 배쉬로 실행해야합니다 . 전체 스크립트 예제는 다음과 같습니다.

#!/bin/bash 

VARS=(FOO BAR BAZ) 

function replaceVars { 
    local V IFS= 
    while read -r LINE; do 
     for V; do 
      LINE=${LINE//"$V"/"${!V}"} 
     done 
    done 
    echo "$LINE" 
} 

replaceVars "${VARS[@]}" < file | process