
第一行是变量,ann
保存着相当复杂的值。我使用第二行的原因是因为我不想更改第三行中的任何内容col1content
。要更改替换,我只需将第二行更改为其他变量。
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'<\/h2>'; echo views_embed_view('frprev_ann'); ?>"
col1content=`echo $ann`
sed -i 's/r'$rownum'c1content/'$col1content'/g' templates/page--front.tpl.php
但是当运行上面的命令时,会出现错误:
sed: -e expression #1, char 19: unterminated `s' command
如果我将第一行更改为ann="testtext"
,一切都会顺利进行。当将第一行更改为 时ann="<?first second"
,它会失败。使用反斜杠也不能帮助我。
答案1
sed -i 's/r'$rownum'c1content/'"$col1content"'/g' templates/page--front.tpl.php
答案2
您无法sed
像这样可靠地传递文本。在替换文本中,您需要通过在其前面添加反斜杠来引用\
和&
分隔s
符(通常为)。/
在正则表达式部分,您需要引用\[.*^$
和分隔符。
此外,您还保留了变量的值以供 shell 进一步扩展。始终在变量替换周围使用双引号,即"$foo"
,不是。如果没有双引号,该值将被解释为以空格分隔的 glob 模式列表;空白并被$foo
\[?*
扩展。
如果您不想更改脚本的工作方式,请正确引用所有内容:
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'</h2>'; echo views_embed_view('frprev_ann'); ?>"
col1content=$(echo "$ann" | sed 's/[\\\/&]/\\&/g')
sed -i "s/r${rownum}c1content/${col1content}/g" templates/page--front.tpl.php
或者,使用 awk 或 perl,它们可以从脚本中读取环境变量。
ann="<?php echo '<h2>'.views_get_view('frprev_ann')->get_title().'</h2>'; echo views_embed_view('frprev_ann'); ?>"
awk -v ann="$ann" -v rownum="$rownum" '
BEGIN {pattern = "r" rownum "c1content"; }
1 {gsub(pattern, ann); print}
' templates/page--front.tpl.php >templates/page--front.tpl.php.new
mv templates/page--front.tpl.php.new templates/page--front.tpl