使用包含符号的变量替换单行的最佳方法

时间:2017-01-06 03:02:45

标签: bash

我必须将文本块插入多个(> 200)html文件中。我决定使用bash来解决这个问题。

必须插入的文本块是多线人:

textblockvar='
 <body class="article toc2 toc-right">
 <div id="readspeaker-button1" class="rs_skip rsbtn rs_preserve"> 
 <a rel="nofollow" class="rsbtn_play" accesskey="L" title="Read 
 out with ReadSpeaker" href="//app-eu.readspeaker.com/cgi-bin
 /rsent?customerid=5&lang=nl_nl&amp;voice=Ilse&re$ 
 <span class="rsbtn_left rsimg rspart"><span 
 class="rsbtn_text"><span>Lees voor</span></span></span> 
 <span class="rsbtn_right rsimg rsplay rspart"></span> 
 </a> 
 </div>
 '

textblockvar将替换所有200多个html文件中似乎一致的<body class="article toc2 toc-right">标记。

我尝试了各种技术来执行替换:

FILES=leerstof/*/*.html
for f in $FILES
do

 sed -e "s|'<body class="article toc2 toc-right"'|${textblockvar}|g" $f

done

然而,脚本总是会出现致命的错误:&#34;未终止的`s&#39;命令&#34;

我试图交换引号,尝试没有引号,但错误仍然存​​在。

也许我的解决方案不是最好的选择。有没有可用的解决方法?

1 个答案:

答案 0 :(得分:0)

这是一种可行的方式:

  1. 使用sed引用您的'命令,而不是"
  2. 使用\n替换字符串变量中的换行符。
  3. 转义替换字符串中的任何&符号,例如...id=5\&lang=nl_nl\&amp;voice=Ilse\&re...
  4. 使用sed -i更改文件。
  5. 如,

    textblockvar='<body class="article toc2 toc-right">\n<div id...'
    ...
    sed -i 's|<body class="article toc2 toc-right"|'$textblockvar'|g' $f
    

    注意:首先在没有-i的情况下测试它,只输出它会做什么,并检查它是否按预期工作。如果是,则使用-i实际更改文件。