复杂的变量内容无法进入sed

复杂的变量内容无法进入sed

第一行是变量,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",不是$foo。如果没有双引号,该值将被解释为以空格分隔的 glob 模式列表;空白并被\[?*扩展。

如果您不想更改脚本的工作方式,请正确引用所有内容:

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

相关内容