2013-09-30 359 views
0

我試圖將HTML模板替換爲一些自定義字符串的佔位符。shell腳本,用於替換HTML文件的字符串

我做一個模板的捲曲在GitHub上:str=$(curl https://raw.github.com/toneworm/template-html5-sass/master/index.html)保存以下變量: -

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<meta name="description" content="[name]"> 
<meta name="author" content=""> 
<title>[name]</title> 
<link type="text/css" rel="stylesheet" href="css/styles.css" /> 
<!--[if lt IE 9]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
</head> 
<body> 
<!-- scripts --> 
<script type="text/javascript" src="js/main.js"></script> 
</body> 
</html> 

我想要做全局替換[name]用別的東西(在這個例子中TEST)。 ..

目前我有sed -i 's/\[name\]/TEST/g' $first > index.html這引發以下錯誤: -

sed: 1: "<!DOCTYPE": invalid command code < 

任何想法?

回答

1

的多個搜索替換退房 this link

您也可以使用Perl其中,不要求您反斜槓內容簡化:

#RAND=$$; 
in1="$1" 
out1="$2"; 
#cp $3 /tmp/$3.$RAND 
in=$in1 out=$out1 perl -pi -e 's/\Q$ENV{"in"}/$ENV{"out"}/g' $3 

,這裏是使用1的另一種方式文件:

url=https://raw.github.com/toneworm/template-html5-sass/master/index.html; curl $url |sed "s:\[name\]:TEST:g" > index1.html 
0
echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html 
+0

您應該雙引號'$ first',否則分詞和擴展名可能會產生意想不到的後果。 –

+0

@GordonDavisson - 是的,你是對的 - 我編輯了我的答案。 –

0

爲什麼要將curl命令的輸出保存爲字符串變量?您可以將該文件保存爲其他名稱,然後將該文件用於sed

curl https://raw.github.com/toneworm/template-html5-sass/master/index.html test.html 
sed "s|\[name\]|TEST|g" test.html > index.html 
0

幾個其他人已經提出瞭解決問題的辦法;讓我解釋爲什麼原文不起作用。實際上有三個問題:

  1. 的sed的-i標誌需要一個參數(在GNU版本的SED可選,在BSD版本的OS X使用需要)。因此s/\[name\]/TEST/g被解釋爲-i的參數,而不是編輯操作。 BTW,-i表示在現有文件上運行,但由於您不在文件上運行,因此無論如何這都是不需要的。

  2. 編輯完成後,sed的下一個參數應該是一個文件名來操作,而不是一個字符串來操作。你需要將它保存到一個文件,或者echo它並將其轉換爲sed。

  3. 由於$first不是雙引號,因此shell在擴展後對其執行分詞(以及其他一些操作)。這意味着「<!DOCTYPE」,「html>」,「<html」等都被作爲單獨的參數傳遞給sed。由於s/\[name\]/TEST/g被解釋爲-i的參數,所以第一個(「<!DOCTYPE」)被視爲編輯命令(這是無效的),其餘爲文件名(它永遠不會嘗試打開)。