2012-08-07 110 views
2

我有這樣一個shell腳本:全球替代shell腳本不工作

for fl in /home/dr/*.txt; do 
mv $fl $fl.old 
sed 's#$1#$2#g' $fl.old > $fl 
rm -f $fl.old 
done 

,我運行它像./script.sh find replace,但沒有任何反應,也沒有輸出。爲什麼是這樣?

+2

在單引號裏''''$ 1'和'$ 2'可能不是你的意思。 – 2012-08-07 10:07:44

回答

2

問題是您使用單引號而不是雙引號。用單引號,sed字面解釋字符串(即它將搜索字符串$1,而不是第一個參數)。

下面是你正在嘗試做的功能版本。請注意,我已經用sed的「in-place」編輯替換了臨時文件的使用情況。

for fl in /home/dr/*.txt 
do 
    sed -i "s#$1#$2#g" $fl 
done 

然而,可以單樣樣在行

sed -i "s#$1#$2#g" /home/dr/*.txt 
+0

感謝您的回答。如果$ 1包含'/'這會導致問題嗎?這就是爲什麼我用#符號代替。並且是'。'故意從txt中省略? – dukevin 2012-08-07 09:39:11

+0

是的,它會導致一個問題,'#'是一個更好的選擇,正是因爲這個原因。對不起。我只是使用斜線作爲習慣的力量。 – 2012-08-07 09:41:22

+0

不,由於我的sl iness,遺漏了'.'。很好,我再次道歉。 – 2012-08-07 09:43:18

3

這可能爲你工作(GNU SED):

sed -i "s#$1#$2#g" /home/dr*.txt 

你有問題是單引號括起來的sed命令不允許插值。

+0

謝謝!這使它起作用 – dukevin 2012-08-07 10:13:20

+0

它看起來像你接受了錯誤的答案。 *被接受的答案已被打破。 – 2012-08-07 10:32:04

+1

@亨克:修好了! – 2012-08-07 10:43:19