2012-07-18 62 views
1

這是我當前的代碼。我試圖用另一個文件名替換文件中的文件名字符串。但我目前得到的錯誤試圖讓sed用另一個文件路徑替換文件中的文件路徑

「的sed:1: 「S /目錄= 」[A-ZA-Z0 ...「:壞的標誌替換命令: 'U'」

什麼不對這個代碼

function restart_existing() 
{ 
    old="directory = \"[A-Za-z0-9\/]\"" 
    new="directory = \"$1\"" 
    sed -i '' "s/$old/$new/" "$HOME/angelpretendconfig" 
} 


restart_existing "$HOME/blahblahblah/shoot/blah" 

編輯:?! 謝謝,我已經通過了你的建議,並適應代碼

function restart_existing() 
{ 
    old="directory = \"*\"" 
    printf -v new 'directory = "%s"' "$1" 
    sed -i '' "s;$old;$new;" "$HOME/angelpretendconfig" 
} 

restart_existing "Query" 

但現在有問題的線路從

directory = "/home/jamie/bump/server" 
directory = "Query"/home/jamie/bump/server" 

爲什麼會發生這種情況?

回答

7

不要使用正斜槓在sed你要替換包含斜槓時:

$ sed 's;foo/bar;baz/wuz;' <<< "where is the foo/bar?" 
where is the baz/wuz? 

此外,有時它更可讀,以避免手動去除報價:

function restart_existing() 
{ 
    old='directory = "[A-Za-z0-9\/]"' 
    printf -v new 'directory = "%s"' "$1" 
    sed -i '' "s;$old;$new;" "$HOME/angelpretendconfig" 
} 

restart_existing "$HOME/blahblahblah/shoot/blah" 
+0

謝謝!我採納了你的建議,並修改了代碼。 功能restart_existing() { 老= 「目錄= \」 * \ 「」 printf的-v新 '目錄= 「%S」' 「$ 1」 SED -i ''「秒; $舊; $新;」 「$ HOME/angelpretendconfig」 } restart_existing 「查詢」 但現在線從 目錄=行 「/家/傑米/凹凸/服務器」 目錄= 「查詢」/家/傑米/凹凸/服務器「 爲什麼會發生這種情況? – 2012-07-18 22:35:16

+0

@KennethTiong因爲'sed's; directory = \」* \「; something;''表示*替換'directory ='後面跟着任意數量的雙引號(加一) something' * – kojiro 2012-07-18 22:43:27

1

$1包含一些東西,它被解析爲sed的特殊命令,在這種情況下可能是/,它標記替換字符串的結尾,後面跟着一些其他字符。

您必須首先逃避替換字符串:Escape a string for a sed replace pattern