我有這樣一個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
,但沒有任何反應,也沒有輸出。爲什麼是這樣?
我有這樣一個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
,但沒有任何反應,也沒有輸出。爲什麼是這樣?
問題是您使用單引號而不是雙引號。用單引號,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
感謝您的回答。如果$ 1包含'/'這會導致問題嗎?這就是爲什麼我用#符號代替。並且是'。'故意從txt中省略? – dukevin 2012-08-07 09:39:11
是的,它會導致一個問題,'#'是一個更好的選擇,正是因爲這個原因。對不起。我只是使用斜線作爲習慣的力量。 – 2012-08-07 09:41:22
不,由於我的sl iness,遺漏了'.'。很好,我再次道歉。 – 2012-08-07 09:43:18
這可能爲你工作(GNU SED):
sed -i "s#$1#$2#g" /home/dr*.txt
你有問題是單引號括起來的sed命令不允許插值。
謝謝!這使它起作用 – dukevin 2012-08-07 10:13:20
它看起來像你接受了錯誤的答案。 *被接受的答案已被打破。 – 2012-08-07 10:32:04
@亨克:修好了! – 2012-08-07 10:43:19
在單引號裏''''$ 1'和'$ 2'可能不是你的意思。 – 2012-08-07 10:07:44