O conteúdo variável complicado falhou ao entrar no sed

1

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.

    
por apasajja 09.10.2012 / 22:40

2 respostas

1
sed -i 's/r'$rownum'c1content/'"$col1content"'/g' templates/page--front.tpl.php
    
por 09.10.2012 / 22:58
1

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 $foo . Sem aspas duplas, o valor é interpretado como uma lista de padrões globais delimitada por espaços em branco; espaço em branco e \[?* 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
    
por 10.10.2012 / 01:22

Tags