2015-08-24 42 views
0

我想使用sed在我的php.ini文件中修改include_path指令。下面,我有一個命令查找一個字符串,並將匹配後的指令放在一行中。但是,我仍然無法在保持$ {install_path}變量中的雙引號的同時繼續工作。雙引號必須在那裏。單引號內的sed命令字符串變量連接

我想編輯的文件是php.ini。下面是幾行前,我的目標,這是對後行之後「UNIX」:

;;;;;;;;;;;;;;;;;;;;;;;;; 
; Paths and Directories ; 
;;;;;;;;;;;;;;;;;;;;;;;;; 

; UNIX: "/path1:/path2" 
;include_path = "/path1:/path2" 
; 
; Windows: "\path1;\path2" 

INSTALL_PATH被定義爲:

install_path="/var/www/mainapp" 

,我使用下面的搜索sed命令對於一個字符串匹配,然後創建下方一個新行:

sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "${install_path}/lib"' /etc/php.ini 

php.ini文件中的預期成果是:

; UNIX: "/path1:/path2" 
include_path = "/var/www/mainapp/lib" 

include_path行已在行「;」後創建。 UNIX:。...」

感謝您的幫助

+0

編輯您的問題以包含一些可測試的示例輸入和預期輸出。同時向我們展示如何填充'install_path'變量。 –

+0

我已經編輯它以具有install_path定義和預期結果。謝謝。 – Freddie

+0

顯示輸出是我們需要的一半 - 顯示輸入。另外,還可以在要更改的行的周圍顯示幾行上下文,因爲更改要更改的部分通常很簡單,但很難更改其他不需要更改的部分。 –

回答

1

。您的主要問題是圍繞shell的引用約定跳舞,同時保留文件中的引號。

你說你定義了install_path="/var/www/mainapp";請注意,引號已被外殼刪除,因此該字符串不包含引號。這在下面很重要。比較新舊:

老:

sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "${install_path}/lib"' /etc/php.ini 

新:

sed -i '/; UNIX: "\/path1:\/path2"/a include_path = "'"${install_path}/lib"'"' /etc/php.ini 

嗯什麼?您已經將腳本正確地包含在單引號中,但這會阻止shell擴展${install_path}。所以,你必須終止單引號字符串,但是你要在輸出中加雙引號,所以我在雙引號後面放了單引號。然後我用雙引號將${install_path}中的值包起來:"${install_path}/lib"。雙引號對於您引用的值並不重要,但通常使用它們是一個好主意。然後,我恢復單引號,並且第一個字符是.ini文件中包含路徑字符串的結尾雙引號,然後關閉單引號字符串。是的,還有其他方法可以寫出最後一點,但需要相當的說服才能讓我相信使用反斜槓的替代方法更好。

如果你真的保存了周圍的安裝路徑值的雙引號:

install_path='"/var/www/mainapp"' 

你可以使用:

sed -i '/; UNIX: "\/path1:\/path2"/a include_path = '"${install_path}/lib" /etc/php.ini 

另外請注意,只有GNU sed讓你把「附加文本」在與a命令相同的行上。 POSIX sed沒有,其他平臺上的其他變體sed不會。例如,在Mac OS X上,您必須編寫以下代碼:

sed -i '/; UNIX: "\/path1:\/path2"/a\ 
include_path = '"${install_path}/lib" /etc/php.ini 
+0

令人驚歎的詳細信息!像魅力一樣工作。非常感謝 - 我不熟悉bash腳本中的引用約定。 – Freddie

0

sed的是個人行簡單的換人,這是所有對於任何稍微更有趣,你應該用awk機會是你想要的東西一樣。這樣的:

awk -v install_path="$install_path" ' 
{ print } 
/; UNIX: "\/path1:\/path2"/ { printf "include_path = \"%s/lib\"\n", install_path } 
' /etc/php.ini 

,但沒有樣品的輸入和預期的輸出是一個猜測要替換原文件中的內容只是添加> tmp && mv tmp /etc/php.ini到年底或使用-i inplace前面用GNU AWK

+0

我編輯了我的問題以包含輸入和輸出。謝謝! – Freddie

+0

目前爲止您已包含輸出,但仍未向我們展示生成該輸出的輸入。不過我希望這個腳本能夠做你想要的東西。 –

+0

感謝您的時間和幫助。 @Jonathan Leffler答案保持了sed的使用並且效果很好。我只是缺少在bash腳本中使用的引用約定。 – Freddie