sed -i 's/r'$rownum'c1content/'"$col1content"'/g' templates/page--front.tpl.php
A primeira linha é variável ann
mantém um valor bastante complicado. A razão pela qual eu uso a segunda linha é porque eu não quero mudar nada na terceira linha col1content
. Para alterar a substituição, só preciso alterar a segunda linha para outra variável.
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
Mas quando o comando acima foi executado, resulta em erro:
sed: -e expression #1, char 19: unterminated 's' command
Se eu alterar a primeira linha para ann="testtext"
, tudo está funcionando corretamente. E quando mudar a primeira linha para ann="<?first second"
, ele falhará. usar barra invertida também não pode me ajudar.
Você não pode passar o texto de forma confiável para sed
dessa forma. No texto de substituição, você precisa citar \
, &
e s
delimitador (geralmente /
) adicionando uma barra invertida antes deles. Na parte de regex, você precisa citar \[.*^$
e o delimitador.
Além disso, você deixou o valor da variável a ser expandido ainda mais pelo shell. Sempre use aspas duplas em torno das substituições de variáveis , ou seja, "$foo"
, não . Sem aspas duplas, o valor é interpretado como uma lista de padrões globais delimitada por espaços em branco; espaço em branco e $foo
\[?*
são expandidos.
Se você não quiser alterar a maneira como o script funciona, cite tudo corretamente:
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
Como alternativa, use awk ou perl, que pode ler uma variável de ambiente dentro do script.
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