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
${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