我正在尝试使用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 <
有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分:0)
echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html
答案 2 :(得分: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
答案 3 :(得分:0)
其他几个人已经提供了解决问题的替代方案;让我解释为什么原来不起作用。实际上有三个问题:
sed的-i
标志接受一个参数(在sed的GNU版本中是可选的,在OS X使用的BSD版本中需要)。因此s/\[name\]/TEST/g
被解释为-i
的参数而不是编辑操作。顺便说一下,-i
表示就地对现有文件进行操作,但由于您不在文件上操作,因此无论如何这都是不需要的。
执行编辑后,sed的下一个参数应该是要操作的文件名,而不是要操作的字符串。您需要将其保存到文件中,或echo
将其保存到sed中。
由于$first
不在双引号中,因此shell在扩展后会对其执行分词(以及其他一些操作)。这意味着“<!DOCTYPE
”,“html>
”,“<html
”等都作为单独的参数传递给sed。由于s/\[name\]/TEST/g
被解释为-i
的参数,因此第一个(“<!DOCTYPE
”)被视为编辑命令(无效),其余为文件名(它为文件名)永远不会试图打开)。