Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 用于替换HTML文件字符串的Shell脚本_Macos_Bash_Shell_Sed_Terminal - Fatal编程技术网

Macos 用于替换HTML文件字符串的Shell脚本

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

我正在尝试使用一个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="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

其他一些人给出了解决问题的替代方案;让我解释一下为什么原版不起作用。实际上有三个问题:

  • sed的
    -i
    标志接受一个参数(在sed的GNU版本中是可选的,在OSX使用的BSD版本中是必需的)。因此,
    s/\[name\]/TEST/g
    被解释为
    -i
    的参数,而不是编辑操作。顺便说一句,
    -i
    意味着对现有文件进行操作,但由于您没有对文件进行操作,因此这是不需要的

  • 在执行编辑之后,sed的下一个参数应该是要操作的文件名,而不是要操作的字符串。您需要将其保存到一个文件中,或者
    echo
    it并将其导入sed


  • 由于
    $first
    不在双引号中,因此shell在扩展后对其执行单词拆分(以及其他一些操作)。这意味着“
    ”,“
    其他几个人已经给出了解决问题的备选方案;让我解释一下为什么原始方案不起作用。实际上有三个问题:

  • sed的
    -i
    标志接受一个参数(在sed的GNU版本中是可选的,在BSD版本OSX使用中是必需的)。因此
    s/\[name\]/TEST/g
    被解释为
    -i
    的一个参数,而不是编辑操作。顺便说一句,
    -i
    意味着对现有文件进行操作,但由于您没有对文件进行操作,因此这是不需要的

  • 在执行编辑之后,sed的下一个参数应该是要操作的文件名,而不是要操作的字符串。您需要将其保存到文件中,或者将其保存到sed中


  • 由于
    $first
    不在双引号中,因此shell在扩展后对其执行分词(以及其他一些操作)。这意味着“
    ”,“
    您应该将
    $first
    双引号,否则分词和全局扩展可能会产生意外的后果。您应该将
    $first
    双引号,否则,分词和全局扩展可能会产生意想不到的后果。