하나의 변수를 다른 변수의 값으로 대체

하나의 변수를 다른 변수의 값으로 대체

input.txt예를 들어 다음 문장이 포함된 텍스트 파일이 있습니다 .

This is my base64 string: ${BASE64}

이 변수가 있습니다.

myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="

예상 출력:

This is my base64 string: SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ==

이 명령으로 작업을 수행해야 한다고 생각했는데 오류가 발생했습니다.

$ sed -i -e "s/\${BASE64}/${myvar}/g" text.txt
sed: -e expression #1, char 70: unknown option to `s'

여러 옵션을 시도하고 몇 시간 동안 인터넷을 검색했지만 정확히 알 수는 없습니다. 내 생각엔 이것이랑 관련이 있는 것 같아\

먼저 내가 뭘 잘못하고 있는지 알고 싶습니다. 둘째, 이 작업을 올바르게 수행하는 방법을 알고 싶습니다. 나는 또한 적절한 awk 예를 좋아합니다.

답변1

가장 큰 문제는 당신이 말한 것입니다 :내 생각엔 그것이 /와 관련이 있는 것 같아. with를 구분 기호로
사용할 때는 /사용하는 문자열에 주의해야 합니다.

따라서 sed명령에 다른 구분 기호를 사용해야 합니다.

sed -i -e "s@\${BASE64}@${myvar}@g" text.txt 

awk를 사용하세요

myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
awk -i inplace -v var='\\$\\{BASE64\\}' -v base="$myvar" '{sub(var,base);}1'

변수를 바꾸는 또 다른 방법은 를 사용하는 것입니다 envsubst. 파일에 변수가 포함되어 있으면 ${BASE64}동일한 이름의 변수를 만들어 파일에서 바꿀 수 있습니다. 하지만 변수를 내보내야 합니다(한번 만) 실행하기 전에 envsubst:

BASE64="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
export BASE64
#Not recommended: 
envsubst < text.txt | tee text.txt
#Or
envsubst < text.txt >  newtext.txt
mv newtext.txt text.txt

답변2

Perl을 사용하면 환경 변수에서 대체 문자열을 읽을 수 있으므로 이를 코드에 포함할 필요가 없으므로 이 작업을 수행하는 것이 더 쉬울 것입니다.

repl=$myvar perl -i -pe 's/\${BASE64}/$ENV{repl}/' input.txt 

(이것은 안전해야 하며 특별한 시퀀스에 대해 평가되지 않아야 합니다.)

답변3

사용행복하다(이전 Perl_6)

~$ env repl="SGVsbG8g_ETCETERA_==" raku -pe 's/\$\{BASE64\}/{ %*ENV<repl> }/'  file.txt

#OR

~$ env repl="SGVsbG8g_ETCETERA_==" raku -pe 's/\$\{BASE64\}/%*ENV<repl>/'  file.txt

입력 예:

This is my base64 string: ${BASE64}

출력 예(잘림 대체 및 전체 길이 대체 사용도 유효함):

This is my base64 string: SGVsbG8g_ETCETERA_==

이 답변은 @ilkkachu의 Perl 답변과 매우 유사합니다(감사합니다!). 변수 env의 철자는 약간 다릅니다. %*ENV이는 Raku의(동적) 운영 체제 환경 변수를 포함하는 해시이며, <repl>이를 인용하지 않고 단일 키를 호출할 수 있는 방법입니다. 두 Raku 답변은 { … }중괄호 삽입에서만 다릅니다. 소스 코드는 아래 NNTP 스레드를 참조하세요(팁 #8).

https://docs.raku.org/언어/variables#index-entry-$PERCENT_SIGN*ENV
https://www.nntp.perl.org/group/perl.perl6.users/2020/07/msg9004.html
https://raku.org

관련 정보