Shell-Script

需要 awk/sed 來替換 ${} 中存在的值

  • October 27, 2018

我正在嘗試通過從 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} and $ {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

因此,如果我將此文件轉換為 shell,我將執行此操作

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

您可以執行以下操作:

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

即替換._單詞字元序列或.位於行首併後跟=或內部的字元${...}

運算符的r標誌y///(因此返回替換的結果而不是應用於變數)需要 perl 5.14 或更高版本。對於舊版本,您始終可以執行以下操作:

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

現在,對於您的最終任務,在這裡完成整個事情同樣容易,perl而不是在非常危險的 shell 中解釋程式碼:

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

引用自:https://unix.stackexchange.com/questions/460328