複雑な変数の内容はsedに入力できません。

複雑な変数の内容はsedに入力できません。

ann最初の行は非常に複雑な値を保持する変数です。 2番目の行を使用する理由は、3番目の行では何も変更したくないからですcol1content。置換を変更するには、2行目を別の変数に変更するだけです。

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/\[.*^$

また、シェルで追加の拡張のために変数値を保存します。変数の置換には常に二重引用符を使用してください。つまり、"$foo"いいえ$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

関連情報