2011-10-06 182 views
34

試圖改變一個文本文件中值SED替代與線bash腳本使用sed的,使用bash變量

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp 

這將是一個for循環。不知道爲什麼它不起作用。有什麼建議麼?

回答

47

'中的變量不會在bash中被替換。要獲得字符串替換(或內插,如果你熟悉perl的),你需要改變它用雙引號",而不是單引號:

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

而且,除非你需要它在不同的文件您可以使用-i標誌更改文件。

+4

也許還要提到,如果變量包含斜槓,則需要使用不會在字符串中出現的不同分隔符(或者在分隔符的每次出現時反斜槓)。斜槓是's'的常用默認值,但您可以使用任何標點符號; 'sed's%draw($ prev_number; n _)%draw($ number; n _)%g「file.txt」或「#from#to#g'或's_from_to_g'等 – tripleee

5
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

這項工作?

13

單引號內的變量未擴展,在雙引號內,在這種情況下使用雙引號。

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp 

你也可以使它與eval一起工作,但不這樣做!

+0

謝謝你的工作。你介意解釋一下你的意思嗎?我的直覺告訴我,它應該是類似的,可變的替代。另外爲什麼不使用eval? – csta

1

您可以使用像下面這樣的變量。像這裏一樣,我想替換hostname即文件中的系統變量。我找的字符串look.melook.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/" 

更換是整條生產線也可以存儲在其他變量系統值,可以使用變量替換。

host_var=`hostname`

sed -i "s/.*look.me.*/look.me=$host_var/"


輸入文件:文件的

look.me=demonic 

輸出(假設我的系統名稱爲prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1