Macos 用于替换HTML文件字符串的Shell脚本
我正在尝试使用一个HTML模板,并用一个自定义字符串替换一些占位符 我正在github上对模板进行卷曲:Macos 用于替换HTML文件字符串的Shell脚本,macos,bash,shell,sed,terminal,Macos,Bash,Shell,Sed,Terminal,我正在尝试使用一个HTML模板,并用一个自定义字符串替换一些占位符 我正在github上对模板进行卷曲:str=$(卷曲https://raw.github.com/toneworm/template-html5-sass/master/index.html)将以下内容保存到变量中:- <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="desc
str=$(卷曲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>
有什么想法吗?为什么要将
curl
命令的输出保存为字符串变量?您可以将文件保存为其他名称,然后将该文件用于sed
echo "$first" | sed -e 's/\[name\]/TEST/g' > index.html
curl https://raw.github.com/toneworm/template-html5-sass/master/index.html test.html
sed "s|\[name\]|TEST|g" test.html > index.html
为什么要将
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
对于多个搜索替换签出 您还可以使用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
对于多个搜索替换签出 您还可以使用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
其他一些人给出了解决问题的替代方案;让我解释一下为什么原版不起作用。实际上有三个问题:
-i
标志接受一个参数(在sed的GNU版本中是可选的,在OSX使用的BSD版本中是必需的)。因此,s/\[name\]/TEST/g
被解释为-i
的参数,而不是编辑操作。顺便说一句,-i
意味着对现有文件进行操作,但由于您没有对文件进行操作,因此这是不需要的echo
it并将其导入sed$first
不在双引号中,因此shell在扩展后对其执行单词拆分(以及其他一些操作)。这意味着“
”,“其他几个人已经给出了解决问题的备选方案;让我解释一下为什么原始方案不起作用。实际上有三个问题:
sed的-i
标志接受一个参数(在sed的GNU版本中是可选的,在BSD版本OSX使用中是必需的)。因此s/\[name\]/TEST/g
被解释为-i
的一个参数,而不是编辑操作。顺便说一句,-i
意味着对现有文件进行操作,但由于您没有对文件进行操作,因此这是不需要的
在执行编辑之后,sed的下一个参数应该是要操作的文件名,而不是要操作的字符串。您需要将其保存到文件中,或者将其保存到sed中
由于$first
不在双引号中,因此shell在扩展后对其执行分词(以及其他一些操作)。这意味着“
”,“您应该将$first
双引号,否则分词和全局扩展可能会产生意外的后果。您应该将$first
双引号,否则,分词和全局扩展可能会产生意想不到的后果。