${}에 있는 값을 바꾸려면 awk/sed가 필요합니다.

${}에 있는 값을 바꾸려면 awk/sed가 필요합니다.

env.properties 파일에서 값을 가져와서 URL 테스트를 하려고 합니다.

예를 들어 내 env.properties는 다음과 같습니다.

a.host.name=wanx.com
b.host.name=xyu.com
c.host.name=${b.host.name}
d.host.name=${c.host.name}

url1=https://${d.host.name}/test
url2=https://${a.host.name}/test2

지금까지 수행한 작업 - 1. 파일에 "."이 있으므로 직접 교체할 수 없습니다. 그래서 awk를 사용하여 점을 밑줄로 바꿨습니다.

awk -F= -vOFS="=" 'gsub(/\./,"_",$1)+1' endpoint_test.txt

이제 내 파일은 아래와 같습니다 -

a_host_name=wanx.com
b_host_name=xyu.com
c_host_name=${b.host.name}
d_host_name=${c.host.name}

url1=https://${d.host.name}/test
url2=https://${a.host.name}/test2
  1. ${b.host.name} 및 ${c.host.name}에 있는 값을 바꾸려고 하는데, Google에서 찾은 awk 명령을 대부분 시도했습니다. 다음은 내가 시도한 명령입니다

    awk -F= -vOFS="${#*}" 'gsub(/\./,"_",$1)+1' endpoint_test2.txt

    awk -F\" '{OFS="\""; for (i = 2; i < NF; i += 2) gsub(/[$,]/,"",$i); gsub(/"/,""); print}' endpoint_test2.txt

그러나 이것은 작동하지 않습니다. ${value}의 점을 밑줄로 변경하고 싶습니다. 따라서 이것을 쉘로 옮기면 쉽게 교체할 수 있습니다.

편집 #1 -

궁극적으로 다음과 같은 출력 파일이 필요합니다.

a_host_name=wanx.com
b_host_name=xyu.com
c_host_name=${b.host.name}
d_host_name=${c.host.name}

url1=https://${d_host_name}/test
url2=https://${a_host_name}/test2

따라서 이 파일을 쉘로 변환하면 이렇게 할 것입니다.

a_host_name=wanx.com
b_host_name=xyu.com
c_host_name=${b_host_name}
d_host_name=${c_host_name}

url1=https://${d_host_name}/test
url2=https://${a_host_name}/test2

echo $url1
echo $url2

이 파일의 출력 -

https://xyu.com/test
https://wanx.com/test2

편집 #2 - bash를 직접 시도했지만 ${}의 값을 바꿔야 하기 때문에 잘못된 교체라고 말했습니다.

편집 #3 -

내가 시도하고 있는 운영 체제는 AIX에 있으며 파일에 "a.host.name"과 동일한 변수가 포함되어 있지 않을 수 있습니다. "a.name.host"와 같은 변수도 포함될 수 있습니다. 예를 들어 파일은 다음과 같습니다.

a.b.host=qwel.wanx.net
b.host.name=ioy.xyu.net
c.xcv.host=poiu.deolite.net
d.host.name=${b.host.name}
e.host.name=${c.host.name}

abcv.stub.url=https://${d.host.name}/test
xcm.stub.url=https://${a.b.host}/test2

이 명령을 사용하면 편집 #3에서 언급한 극단적인 경우를 달성할 수 있었습니다.

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/ $_ = $&; tr|.|_|; $_ /ge' file

이제 내 출력은 다음과 같습니다.

a_b_host=qwel.wanx.net
b_host_name=ioy.xyu.net
c_xcv_host=poiu.deolite.net
d_host_name=${b_host_name}
e_host_name=${c_host_name}

abcv_stub_url=https://${d_host_name}/test
xcm_stub_url=https://${a_b_host}/test2

마지막으로 URL을 아래와 같이 별도의 파일에 넣어야 합니다.

https://ioy.xyu.net/test
https://qwel.wanx.net/test2

답변1

다음을 수행할 수 있습니다.

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$& =~ y|.|_|r/ge' < file

즉, 은 단어의 문자 시퀀스 .로 대체되거나 또는 뒤에 오는 행의 시작 부분에 있는 또는 내부로 대체됩니다 ._.=${...}

r연산자에 대한 플래그( y///대체 결과가 변수에 적용되지 않고 반환되도록)에는 perl 5.14 이상이 필요합니다. 이전 버전의 경우 언제든지 다음을 수행할 수 있습니다.

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$_ = $&; y|.|_|; $_/ge' < file

perl이제 마지막 작업을 위해 여기에서 모든 작업을 수행하는 것은 셸의 코드를 해석하는 것만큼 쉬우며 이는 매우 위험합니다.

 perl -lne '
    s/\$\{([\w.]+)\}/$v{$1}/g;
    if (/^([\w.]+)=(.*)/) {
      $v{$1} = $v = $2;
      print $v if $1 =~ /_url$/
    }' < file > separate-file

답변2

다음을 시도해 볼 수 있습니다.

cat get_env_properties.sh 
sed -i'.bak' '
  :A
    s/\(.*\)\(\.\)\([^=]*=.*\)/\1_\3/
    tA
  :B
    s/\([^{]*{.*\)\(\.\)\([^}]*}.*\)/\1_\3/
    tB
' "$1"

. "$1"

echo "url1 = $url1"
echo "url2 = $url2"

mv "$1.bak" "$1"

넌 그걸 그렇게 부르잖아

./get_env_properties.sh env.properties

귀하의 sed는 -i를 사용할 수 있어야 합니다.

답변3

"이 파일의 출력"이 의미하는 것이 궁극적으로 원하는 것이라면 다음을 시도하십시오.

    awk -F= '
                    {gsub (/[${}]/, "")
                    }
    !/^url/         {T[$1]=($2 in T)?T[$2]:$2
                     next
                    }
                    {sub (/^url[^=]*=/, "")
                     for (t in T)   if ($0 ~ t) sub (t, T[t])
                    }
    1
    ' file
https://xyu.com/test
https://wanx.com/test2

답변4

이 시도,

sed -e 's/\./_/g' -e '/com/ s/_/\./3g' test789
a_host_name=wanx.com
b_host_name=xyu.com
c_host_name=${b_host_name}
d_host_name=${c_host_name}

url1=https://${d_host_name}/test
url2=https://${a_host_name}/test2
  • 첫 번째 sed는 모두를 .다음으로 대체합니다._
  • _라인에 다음이 있는 경우 .두 번째 sed가 세 번째 sed를 대체합니다.com

관련 정보