2010-08-09 47 views
0

HIshell脚本所有文件中的令牌替换文件夹中

我不是很好的Linux外壳scripting.I正在尝试下面的shell脚本,以取代所有HTML文件

版本号标记$rev -<rev number>下指定目录

cd /home/myapp/test 
set repUpRev = "`svnversion`" 
echo $repUpRev 
grep -lr -e '\$rev -'.$repUpRev.'\$' *.html | xargs sed -i 's/'\$rev -'.$repUpRev.'\$'/'\$rev -.*$'/g' 

这似乎不起作用,上面的代码出了什么问题?

+0

你在用什么外壳?当你只说“不工作”时,这不是很有帮助。请详细说明错误消息或行为与预期的不同之处。 – 2010-08-09 15:15:38

回答

1
rev=$(svnversion) 
sed -i.bak "s/$rev/some other string/g" *.html 
0

什么是正则表达式字符串中的$ rev?它是另一个变量吗?或者你正在寻找一个字符串'$ rev'。如果后者 - 我建议增加“\”之前$否则会被视为一个特殊的正则表达式字符...

+0

我已根据您的评论更新了代码,但它说 “sed:无输入文件 ” – Sourabh 2010-08-09 12:57:22

0

这是你如何显示的最后一行:

grep -lr -e '\$rev -'.$repUpRev.'\$' *.html | xargs sed -i 's/'\$rev -'.$repUpRev.'\$'/'\$rev -.*$'/g' 

这将有助于如果你展示了一些输入数据。

-r选项使grep递归。这意味着它将操作目录的子目录中的文件。那是你的意图吗?

grepsed中的点代表任何字符。如果你想要字面点,你需要逃避它们。

grepsed命令中的最终逃逸美元符号将被视为文字美元符号。如果您想要锚定到该行的末尾,则应该删除该转义。

.*仅作为字符串在seds命令的右侧起作用。如果要包含左侧的匹配项,则需要使用捕获组。仅当模式在一行中出现多次时,才需要s命令中的g修饰符。

使用引号,引号,引号,引号很难阅读。使用双引号来允许变量扩展。

尝试使用您自己的grep命令,而不使用xargssed来查看它是否生成文件列表。

这可能是更接近你想要什么:

grep -lr -e "\$rev -.$repUpRev.$" *.html | xargs sed -i "s/\$rev -.$repUpRev.$/\$rev -REPLACEMENT_TEXT/g" 

,但你仍然需要确定g修改,点,最终美元符号等等,都是你打算什么。

相关问题