2017-02-01 1 views
1

내가 나오지 사용하여 파일에서 (변수 이름의 이름을 따서 명명) 자리를 대체 할 수대체 쉘 변수 참조

$clientId = '${ID}'; 
$clientSecret = '${SECRET}'; 

:

ID="toto" 
SECRET="tata" 
sed -i -e "s/\${ID}/$ID/" -e "s/\${SECRET}/$SECRET/" $file 

그것은이 대체를

$clientId = 'toto'; 
$clientSecret = 'tata'; 

나는 인수를 사용하여 루프를 통해이 작업을하려고합니다 :

ID="toto" 
SECRET="tata" 
OTHER="franck" 
./config.sh $file $ID $SECRET $OTHER 

config.sh

for var in "${@:2}"; do 
    echo "$var" # toto or tata or franck 
    echo $!{var} # always var whatever I try, would like ID or {SECRET} or ${OTHER} 
    SETTINGS="$SETTINGS -e "s/\${var}/$var/"" # so this has no effect 
done 

FILE=$1 
sed -i $SETTINGS $FILE 

답변

1

당신은 문제를 해결하기 위해 config.sh 조금을 다시 작성할 수 있습니다.변수 이름과 하지 그 값 전달해야

-e 's/${ID}/toto/' -e 's/${SECRET}/tata/' -e 's/${OTHER}/franck/' 
: 스크립트에 의해 생성 된

ID="toto" SECRET="tata" OTHER="franck" ./config.sh file ID SECRET OTHER 

sed 표현 :

export ID="toto" SECRET="tata" OTHER="franck" 
./config.sh file ID SECRET OTHER 

또는 당신은 export을하지 않으려면

위 전화 후 파일 :

$clientId = 'toto'; 
$clientSecret = 'tata'; 
$publication = 'franck'; 
+0

감사합니다. – kursus

+0

'$ sed_expr'이 정확히 예상대로 임에도 불구하고'sed' 명령은 스크립트 내에서 작동하지 않지만'sed : -e expression # 1, char 2 : unknown command :'-''를 얻습니다. 터미널에서 똑같은 출력 명령을 실행할 때 예상대로 작동합니다. 이것에 대한 어떤 생각? – kursus

+0

작은 따옴표,'e' 옵션을 제거하고 루프에서'sed' 명령을 실행하여 해결했습니다. 고맙습니다. – kursus

1

는 다음 sed 일련의 명령으로 데이터를 편집 (sed에 스크립트를 제공하기 위해 -f /dev/stdin를 사용하는 sed를 사용하여 실행할 sed 스크립트를 생성하는 너 자신의 뒤에 임시 파일을 청소하는 것을 피함).

FILE="$1" 
shift 
printf '%s\n' "[email protected]" | 
sed 's/^\([A-Z][A-Z]*\)=\(.*\)/s%\\${\1}%\2%/' | 
sed -i.bak -f /dev/stdin "$FILE" 

널 백업 접미사 표기법은 BSD (맥 OS) sed 작동하지 않습니다, 그래서 접미사로 .bak 교체.

이 호출을 가정의 형식입니다 : 이름과 값

file="data" 
ID="toto" 
SECRET="tata" 
OTHER="franck" 
./config.sh $file "ID=$ID" "SECRET=$SECRET" "OTHER=$OTHER" 

이 모두 제공해야합니다.

$clientId = '${ID}'; 
$clientSecret = '${SECRET}'; 
$publication = '${OTHER}'; 

출력 파일은 다음과 같습니다 : 포함하는 데이터 파일 data을 감안할 때

$clientId = 'toto'; 
$clientSecret = 'tata'; 
$pulication = 'franck'; 

생성 된 스크립트의 형식은 다음과 같습니다

s%\${ID}%toto% 
s%\${SECRET}%tata% 
s%\${OTHER}%franck% 

당신은 대신에 사용되지 않은 문자를 사용할 수 있습니다 % 심볼; Control-A과 같은 제어 문자는 매우 효과적 일 수 있습니다.

# grab the output file name 
file=$1 
shift 
# loop through the rest of args which are names of variables that 
# need to be substituted 
for var in "${@}"; do 
    # note: ${var} and ${!var} do get evaluated inside single quotes so long as 
    # there are enclosing double quotes around them 
    sed_expr=${sed_expr}" -e 's/\${$var}/${!var}/'" 
done 

# enclose sed_expr as well file in double quotes to prevent 
# word splitting and globbig 
sed -i "$sed_expr" "$file" 

을 그리고 아래를 호출합니다