2010-10-13 42 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