2013-11-22 88 views
1

我已經寫了一個bash腳本,它在一個文件上調用一個sed命令(其中包括)來完成一個查找/替換2個不同的字符串。SED命令不能從bash腳本運行

麻煩的是,在運行腳本之後,我檢查了這些文件,沒有任何更新。但是,如果我運行正在生成的命令(無論如何都將它們作爲輸出回顯),那麼它們就可以工作。

例如,在腳本中我有:

echo "/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${String2R}\//g' ${ROOT_DIR}/data/file.sql" 
/usr/local/bin/sed -i -e 's/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g' ${ROOT_DIR}/data/file.sql 

運行腳本不file.sql變化;但是,如果我運行打印到控制檯的命令,例如/ usr/local/bin/sed -i -e's/file_name1/file_name2/g; s // path_substring1 /// path_substring2 // g'/path/to/file/file.sql它完美的工作!

+1

我沒有得到「回聲」的目的...... – opalenzuela

+0

只是爲了調試 – user2294382

+0

你使用「string」這個詞很多,但你的腳本沒有做字符串比較,它是做正則表達式比較,是好?它會回來咬你,如果「String1」。例如,包含RE元字符,如'.','?','*'等。 –

回答

5

使用雙引號而不是單引號。單引號會阻止可變擴展。

/usr/local/bin/sed -i -e "s/${String1}/${String1R}/g;s/\/${String2}\//\/${TString2R}\//g" ${ROOT_DIR}/data/file.sql 

而且,似乎你的變量是可能包含着路徑字符串斜線,即/。在這種情況下使用不同的分隔符:

"s|${String1}|${String1R}|g" 

使用不同的分隔將避免逃避的模式和替代/的需要。

+0

謝謝devnull。有一件事,用/替換/沒有工作。幸運的是,路徑子字符串不應該包含任何斜線,但它將更清潔,無需轉義它們。你是否需要提供分隔符作爲單獨的參數? – user2294382

+0

@ user2294382我不知道爲什麼它不適合你。例如,嘗試執行命令:'echo a/b/c | sed「s |/b/| // d // | g」'並觀察它的作用。 – devnull

+0

嗯奇怪的工作 - 我得到一個///// C。我一定做錯了什麼。謝謝 – user2294382