2015-10-09 32 views
4

我想寫一個sed命令從環境變量與值替換標記在一個文件中,像這樣展開的環境變量在這種情況下),然後替換具有相同名稱的環境變量的值。與sed的

這可能嗎?目前上面打印something $my_var bar而不是something foo bar這是我想要的。

我打算使用另一種工具,如awk,而不是使用sed。

回答

3

更換{{my_var}}$my_var後,您需要發送的字符串第二一輪明確的替代。

eval

$ eval echo "$(echo 'something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g')" 
something foo bar 

或子shell

$ echo 'echo something {{my_var}} bar' | sed 's/{{\([^}]\+\)}}/$\1/g' | sh 
something foo bar 

Perl可以做替換文本這第二輪評估而已,而不是整個輸出(與s///功能的e修正) :

$ echo 'something {{my_var}} bar' | perl -pe 's/\{\{(\w+)\}\}/$ENV{$1}/eg' 
something foo bar 
+0

謝謝,Perl示例正是我正在尋找的 – toby

+0

我還發現[envsubst](https://www.gnu.org/software/gettext/manual/html_node/envsubst- Invocation.html),它在輸入中使用一種稍微不同的標記格式,但具有所需的功能 – toby

0

如果要使用變量,請在變量前添加$符號。

出口my_var = foo的

回聲 「的東西{{$ my_var}}欄」 | sed -r「s/{{(。*?)}}/$ \ 1/g」| SED的| [$] || G'

輸出:

東西富巴

+0

越來越近,這給了我'什麼$ foo酒吧'任何想法如何在結果字符串中刪除$?原始字符串中的格式可以是任何使它最簡單的格式 – toby

+0

檢查它,現在它運行正常,並且重播 – Nullpointer

+1

非常感謝,它確實有效,但我意識到我的原始示例存在問題 - $ my_var正在被替換爲echo命令而不是sed所以'echo'something {{$ my_var}} bar'| sed -r「s/\ {\ {(。*?)\} \}/$ \ 1/g」'產生'something $$ my_var bar'和'echo'something {{$ my_var}} bar'| sed -r「s/\ {\ {(。*?)\} \}/$ \ 1/g」| sed's | [$] || g''產生'something my_var bar' – toby