2015-04-27 65 views
0

我想在sed中使用一個變量,但不能解決它。我試過在sed中使用變量

read -p " enter your name" name 
sed -i 's/myname/$name/g' file 

但不幸的是它只是用「$ name」替換myname。 有沒有其他的方法?

+0

你用'$ {name}'試過了嗎? – Preuk

+0

這應該工作!你使用某種類型的外殼? – hek2mgl

+0

也很好用,謝謝 – rog

回答

-2

name應該由外殼加以解釋,如果是雙引號內,按:

pax> read -p "Enter your name: " name 
Enter your name: Bob 
pax> echo "Hello, $name, how are you?" 
Hello, Bob, how are you? 

當你使用單引號,不會是情況:

pax> echo 'Hello, $name, how are you?' 
Hello, $name, how are you? 

但是,在這種情況下,假設你需要單出於某種原因引號(如防止插在別處的字符串),你可以外面的引號移動變量

pax> echo 'Hello, '$name', how are you?' 
Hello, Bob, how are you? 

在特定情況下,這將是:

sed -i 's/myname/'$name'/g' file 

儘管您可能想要留意邊緣情況,例如需要保留字符串中的特定間距,例如(我沒有測試過這個):

sed -i 's/myname/'"$name"'/g' file 

但底線是,如果您使用bash而您不需要需要單引號,則雙引號應該允許插值。

但是,即使你讓你的命令,從bash重新分詞的行動安全,還是有供用戶如果,例如,他們進入重要的東西sed本身,如/搞砸的機會字符。

如果你想要他們的主目錄,你最好是對輸入進行消毒處理(例如參見回答here),或者使用類似$HOME的東西。

一個確定的「傻瓜」,通常可以打破任何萬無一失的系統,但也有辦法讓它不太可能比只是一味地使用他們的投入:-)


至少這將是bash 。如果你使用的是雙引號的變量,那麼你可能仍然可以在這個答案中使用解決方案(儘管它當然取決於shell)。

+1

這樣做的好處是什麼?除了給用戶輸入他的名字時注入shell命令的機會嗎? – hek2mgl

+0

感謝paxdiablo的快速反應,完美工作 – rog

+0

@ hek2mgl,好處是可以按照要求解釋字符串:-) – paxdiablo