2009-11-03 43 views
1

我猜这必须是一个逃避的问题,但我找不到它。最令人沮丧的是,这是基于我以前使用过的旧版sed脚本,那么为什么我在一年后尝试重新使用脚本时无法使其工作? ;)如何解决这个sed问题与未终止的行?

框架:

我有在它的文件名列表,都需要同样的 串HTML的搜索和替换的文件。

我需要

<a href="foo.html">Foo</a><a href="bar.html">Bar</a> 

我是用更换

<a href="foo.html">Foo</a> 

#!/bin/bash 
for i in $(cat sourcelist); do cat $i | sed 's,<a href="foo.html">Foo</a>,<a href="foo.html">Foo</a><a href="bar.html">Bar</a>,g' > $i.bak ; mv $i.bak $i ; done 
#end 

但我得到SED错误 “未结束的'S'命令”。

我试图逃避双引号,斜线,两者仍然不能得到它的解析。

这是晚了,我失去焦点。那里有什么尖锐的眼睛可以抓住我失踪的东西?

+1

它运行得很好。你在做替换就像上面那样或者是foo和bar(也许你有一个额外的逗号的地方?) – Amro 2009-11-03 07:13:06

+0

而不是试图逃避的东西,为什么不尝试消除它们只是举个例子?尝试使用BAR作为替代文本,单独匹配第一个标记,单独匹配“foo.html”,单独匹配.html。简化,直到sed停止抱怨,然后看看问题是什么。 – Beta 2009-11-03 20:03:21

+0

好点Beta,一次解决它并不总是最好的主意。 :) – 2009-11-04 02:09:07

回答

0

您是否尝试过逃避引号? e.g:

#!/bin/bash 
for i in $(cat sourcelist); do cat $i | sed 's,<a href=\"foo.html\">Foo</a>,<a href=\"foo.html\">Foo</a><a href=\"bar.html\">Bar</a>,g' > $i.bak ; mv $i.bak $i ; done 
#end 
+0

你不需要逃避这里的双引号 – Amro 2009-11-03 07:14:34

2

尽量不要使用一个for循环中包含的是,由于空间问题的猫。另外,sed的猫也没用。

while read -r line 
do 
    sed 's,<a href=\"foo.html\">Foo</a>,<a href=\"foo.html\">Foo</a><a href=\"bar.html\">Bar</a>,g' "${line}" > "${line}.bak" 
    mv "${line}.bak" "${line}" 
done < sourcelist 

当然,如果你使用GNU sed的,有-i选项来为您创建的备份。

0

通过在运行荷银的while循环固定它:

#!/bin/bash 

for i in $(cat sourcelist); do 

while read line 
do 
    sed 's,<a href=\"foo.html\">FOO</a>,<a href=\"foo.html\">FOO</a> 
    <a href=\"bar.html\">Bar</a>,g' 
     done < $i > $i.bak ; mv $i.bak $i ; done 

未必是最优雅的,但它的作品。

干杯。

+0

为什么你拿出两个单独的ID? – 2009-11-03 18:16:37

+0

首先,这不是我的解决方案,我只是添加了一个修复程序。其次,我们假设'sourcelist'文件每行包含一个文件名。 while循环的原因是为了避免文件名中的空格问题。你上面的代码对我没有意义吗? – Amro 2009-11-04 00:33:57

+0

sourcelist是每行一个文件名,你是正确的Amro。从文件中的Readline没有按预期工作,所以我想我会把它作为一个变量填充,看它是否工作。我没有知识水平来解释它,只能说这个例子中的所有例子都适用。 ;) – 2009-11-04 02:12:22