2013-08-26 46 views
0

這應該很簡單,但我無法擺脫它:轉義UNIX字符

我需要使用unix命令行替換.php文件中的一段文本。

使用:sudo sed -i '' 's/STRING/REPLACEMENT/g' /file.php(引號-i需要後,因爲它運行在Mac OS X)

字符串:['password'] = "";需要被替換:['password'] = "$PASS"; $ PASS是一個變量,所以它得到填補。

我起身類似:

sudo sed -i '' 's/[\'password\'] = ""\;/[\'password\'] = "$PASS"\;/g' /file.php

但由於我是新與UNIX我不知道逃避什麼?

應該改變什麼?謝謝!

+1

接受的答案實際上並不具有任意字符串的工作 - 事實上,惡意密碼可能結束的運行sed命令(替換操作)並啓動另一個任意的操作,對用戶的選擇進行任何編輯,以便對您的配置文件進行編輯!請考慮awk答案,或http://mywiki.wooledge.org/BashFAQ/021 –

回答

0

如果你想在中美戰略經濟對話,擴大變量,你必須使用雙引號,所以像

sed -i... "s/.../.../g" file 

也就是說,你不必逃避這些單引號,也可以使用組參考以節省一些打字。您可以嘗試:

sudo sed -i '' "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" /file.php 
+0

工作就像一個魅力..謝謝! – Laurent

+2

請注意,如果PASS只包含字母和數字,它將工作正常,但對於變量PASS的各種其他值,它將以加密方式失敗。例如用'PASS ='foo/bar''來嘗試。 –

+2

@EdMorton如果你很幸運,失敗就是失敗;如果提供密碼的用戶是惡意的,它也可以任意注入sed命令。 –

1

不幸的是,sed無法穩健地處理可能包含對sed和shell「特殊」的各種字符的變量。你需要爲此使用awk,例如與GNU AWK的gensub():

gawk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file 

查看如何SED以下時失敗PASS包含正斜槓,但awk並不在意:

$ cat file 
The string: ['password'] = ""; needs to be replaced 

$ PASS='foo' 
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file 
The string: ['password'] = "foo"; needs to be replaced 
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file 
The string: ['password'] = "foo"; needs to be replaced 

$ PASS='foo/bar' 
$ awk -v pass="$PASS" '{$0=gensub(/(\[\047password\047] = \")/,"\\1"pass,"g")}1' file 
The string: ['password'] = "foo/bar"; needs to be replaced 
$ sed "s/\(\['password'\] = \"\)\(\";\)/\1$PASS\2/g" file 
sed: -e expression #1, char 38: unknown option to `s' 

您需要使用\047或其他方法(如果您願意,可以使用'"'"')代表單引號分隔的awk腳本中的單引號。

在沒有gensub awks()你只需要使用GSUB()代替:

awk -v pass="$PASS" '{pre="\\[\047password\047] = \""; gsub(pre,pre pass)}1' file