2010-10-13 43 views
3

你好友計算的人,在多個文件的shell腳本上使用sed

這是一個兩部分問題。我正在編寫兩個shell腳本,目標是在文件夾及其子文件夾中的所有index.php文件中執行「查找並替換」。

第一個shell腳本是這樣的:

echo "running on all directories…" 

find . -name '*.php' -exec ./search_replace.sh {} \; 

,然後運行該文件search_replace:

我的問題/問題是:

  1. 當我運行第一個腳本它回聲「運行搜索和替換腳本...」13次,這是有道理的,因爲有13個索引.php文件夾中。但結果是隻有一個文件被完成,即單詞被替換並且僅創建一次新的htm文件。

  2. 有沒有辦法做到這一點,而不是基於.php文件創建一個新的.htm文件,我可以只用相同的index.php文件替換單詞?換句話說,他們可以編輯文件而不必創建一個新文件。

非常感謝,

+2

如果你使用'備用分隔符sed'你不會有逃避所有的斜線:'sed的-e的| HTTP :// ... | file:// ... | g' – 2010-10-13 14:51:41

+0

@丹尼斯 - 這是最好的sed提示之一 - 因爲斜線無處不在所以非常有用(一如既往)! – KevinDTimm 2010-10-13 18:49:46

+0

在Perl世界中,我們稱之爲'http:\/\ /'類型的混亂「Leaning Toothpick Syndrome」。備用分隔符是你的朋友。 – 2010-10-13 23:56:07

回答

1

由於全路徑名發送到您的search_replace.sh,你可以用$ 1 $ 1.htm代替的index.php,index.htm的再

mv $1.htm $1 

爲您的sed

後重新行:您的意見

sed -e 's/http:\/\/ericbrotto.com/file:\/\/\/Users\/ericbrotto\/Documents\/Portfolio_CV_etc.\/Offline_Portfolio/g' index.php > index.html 

行S/B

sed -e 's/http:\/\/ericbrotto.com/file:\/\/\/Users\/ericbrotto\/Documents\/Portfolio_CV_etc.\/Offline_Portfolio/g' $1 > $1.html 
mv $1.html $1 
+0

感謝您的貢獻,但是在將其寫入我的第二個shell腳本後,我得不到任何結果:sed -e's/http:\/\/ericbrotto.com/file:\/\/\/Users \/ericbrotto \ /Documents\/Portfolio_CV_etc.\/Offline_Portfolio/g'mv $ 1.htm $ 1 – 2010-10-13 17:26:16

+0

您是否實施了我的更新? – KevinDTimm 2010-10-15 17:04:30

0
find . -name '*.php' -type f -exec sed -i 's|http:\/\/ericbrotto.com|file:\/\/\/Users\/ericbrotto\/Documents\/Portfolio_CV_etc.\/Offline_Portfolio|g' "{}" +; 
+0

謝謝!不幸的是,這給了我錯誤:sed:1:「./EricBrotto/berit/inde ...」:無效的命令代碼。有任何想法嗎? – 2010-10-13 17:22:44

+1

將您的///'改爲'|||',然後再次檢查並退出所有斜槓。 – ghostdog74 2010-10-13 23:40:15