2009-11-03 41 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